aardio教程一) 基礎語法-上

来源:https://www.cnblogs.com/kanadeblisst/p/18075162
-Advertisement-
Play Games

前言 想開發一些小工具,所以想系統性的學習一遍aardio,之前都是哪裡不會搜哪裡,順便寫些教程。我的主要語言是Python,所以會以Python作為對比來加深印象。 aardio的基礎語法和JavaScript基本類似,如果你學過JavaScript,aardio很容易上手。下麵的文檔來自官方文檔 ...


前言

想開發一些小工具,所以想系統性的學習一遍aardio,之前都是哪裡不會搜哪裡,順便寫些教程。我的主要語言是Python,所以會以Python作為對比來加深印象。

aardio的基礎語法和JavaScript基本類似,如果你學過JavaScript,aardio很容易上手。下麵的文檔來自官方文檔 [1]

問題搜索途徑

基礎語法看:https://bbs.aardio.com/doc/reference/

一些庫的使用,獲取文檔有以下途徑:

  1. aardio官方論壇(https://bbs.aardio.com),我一般用谷歌搜索 site:bbs.aardio.com 搜索內容
  2. aardio官方公眾號
  3. 打開編輯器開始頁的話有開髮指南和文檔資源,右側有官方資訊,剛入門都可以看一下。裡面的庫函數文檔我經常用
  4. 寫一個函數的時候右鍵轉到定義,庫代碼下麵一般都有註釋怎麼用
  5. 用vscode打開整個aardio軟體目錄,搜索你不知道怎麼用的庫,看看官方是怎麼使用的,這個我用的最多
  6. aardio相關的第三方論壇:https://aardio.online/thread-20.htm

語法

標識符

變數標識符的定義和Python基本一樣,語法如下:

  • 字母(區分大小寫)、數字和下劃線,也可以用中文
  • 數字不能作為變數首個字元

與Python不同的點:

  • 除了單個下劃線_,其他下劃線開頭的為常量,定義後無法被修改
  • 可以以$符開頭
  • 包含中文時,前面不能有字元和數字

關鍵字

- -
var 用於定義局部變數 def 用於定義關鍵字
and not or 邏輯運算符 begin end 用於包含語句塊
if else elseif 用於條件判斷語句 for in 用於迴圈語句
select case 用於條件判斷語句 try catch 用於捕獲異常
break continue 迴圈中斷語句 function 用於創建函數
namespace 用於創建或打開名字空間 import 用於引用庫
this 用於在類內部表示當前實例對象 global 用於表示全局名字空間
owner 用於表示調用函數的主體對象 while do 用於迴圈語句
null 用於表示空值 false true 用於表示布爾值
class ctor 用於創建類 return 用於函數中返回值
with 用於打開名字空間 self 用於表示當前名字空間

你如果閑的無聊的話,也可以使用def自定義關鍵詞,比如:

def 如果 = if
def 否則 = else
def 否則是 = elseif
def 名字空間= namespace
def 迴圈 = while

io.open();

如果 1== 1 {
    io.print(" 1等於1 ")
}
否則{
    io.print(" 1不等於1 ")
}

改個名字和圖標,一款新的中文編程語言就寫好了

分隔符和註釋符

分隔每條語句可以用換行或者分號, 一下三種方法都可以:
var a = 1; var b = 2;

var a, b = 1, 2;

# 後面的分號可寫可不寫,我一般都寫上
var a = 1
var b = 2

註釋則是使用///**/,也可以使用多個/******/,只需要前面和後面的數量對應上

操作符

算術運算符 + - * / ** %
按位運算符 ~ 取反 & ` ` 或 ^ 異或 << 左移
等式運算符 == !=
邏輯運算符 ! not ` or :` && and ?
關係運算符 > < >= <=
連接運算符 ++
取長運算符 #
全局變數定義 ::
成員操作符 . [] [[]]
包含操作符 $
  • 字元串之間使用關係運算符時,是從第一個字元開始比較,這個和Python也是一樣的
  • ++並不是c語言裡面的自增,而是用於字元串和字元串拼接,或者字元串和數值拼接。例如: 1 ++ "2" == "12",也可以省略成1+"2"
  • 取長運算符用於獲取字元串和數組長度,如果是對象則調用_len元方法
  • 在變數名前面加::表示為全局常量,比如::Kernel32 := raw.loadDll("Kernel32.dll");,可以避免重覆載入dll
  • 成員操作符.和[]基本可以混用,除非成員名稱不符合aardio命令規定則使用[]
  • [[]]一般是在元方法中使用,它不會調用元方法,可以避免無限遞歸
  • 路徑字元串前加$符表示內嵌該文件到編譯後的exe中

邏輯運算符

||or:再使用上基本沒有區別,大部分情況下可以互相替換。

  • 邏輯與和邏輯或運算符就能組成類似三元運算符的效果 true ? 1 : 0
  • a := 1等同於a = a : 1,可以用於避免重覆賦值
  • a ?= f(a)等同於a = a ? f(a),可以只當a不為null執行f(a)
  • 也有像Python一樣的用邏輯運算符做條件取值的操作,比如a = 1 or 2b = 0 or 3。語法和意思也和Python是一樣的

按位無符號右移

a >>> n 將數值a按位向右移動n位(如果n大於等於32,則為n對32取模結果的位數) ,不保留符號位(負數不保持最高位為1,因此右移後會變成正數)

實際用途:

可以通過右移 0 位將有符號數強制轉換為無符號數。例如 -1 >>> 0 的值為 0xFFFFFFFF , 其作用等價於 raw.convert( {int value = -1},{INT value}).value。

不聲明調用靜態 API 預設會返回 32位有符號整數,如果原 API 返回的是 32位無符號整數,那麼只要簡單的將返回值 >>> 0 就可以得到原來的無符號數值了

這裡有一點很重要: 記憶體里的數據都是0和1,它是什麼值只取決於你以什麼類型讀取它

等式運算符

基礎數據類型會判斷值是否相等,而非基本類型則是判斷對象是否相等或者調用_eq元方法判斷

元方法類似Python的魔法方法,可以重載對象的符號運算,比如_eq重載==

0, nullfalse 相等,其他類型都與true想等

跟數值類型比較時:

  • 字元串會自動轉為數值類型再做比較,空字元串""轉為0,空白字元\r\n\t也是轉為0
  • 如果是對象,則是調用_tonumber元方法轉數值
表達式 結果
"123"==123 true
"abc"==123 false
""==0 true
'\r\n\t '==0 true
null==0 false

還有一個恆等判斷的符號===!==,它不會調用_eq元方法,直接判斷類型和數值都相等

運算符優先順序

這個東西沒必要記,有疑問時加括弧即可。遇到別人的代碼有疑問,可以運行測試下

基礎數據類型

類型 舉例值 說明
type.null null
type.boolean 布爾值
type.number 數值 預設為64位浮點數
type.string 字元串 字元串和Python也基本一樣,utf-8編碼
type.buffer raw.buffer 可用於接收c語言char*數據
type.pointer 指針 接收dll返回的指針數據,或者使用topointer(obj)
type.table aardio中的數組、字典等複雜類型
type.function 函數 function創建的函數
type.cdata 內核對象 一般不用關心
type.fiber 纖程 沒用過
type.class class關鍵詞創建的類

null

任何沒有定義或賦值的變數預設都是null。如果函數不傳參數,預設傳過去的也是null。

import console; 
console.dump(a);
console.pause(true);
import console; 
function f(a){
	console.dump(a);
}
f()
console.pause(true);

數值類型

  • 2#11表示二進位數,8#11表示八進位數,16#A表示十六進位數,也可以表示為0xA
  • 2e+20(2x10**20)表示科學計數法, +僅表示指數的正負,可加可不加
  • 可以用_來分隔數值,111_222等同於111222

字元串

aardio中定義的字元串都是utf-8編碼

string.fromUnicode(s)string.toUnicode(s)可以做utf-8 <=> utf-16的轉換,Windows上使用的Unicode編碼一般就是指的utf-16,兩個函數都可以指定第二個參數,代表目標編碼的代碼頁,用於轉換其他編碼。

常用的代碼頁: 936(gb2312)、1200(utf-16 le)、1201(utf-16 be)、65001(utf-8)。所有代碼頁可以參考: 標準代碼頁(codepage)列表 [2]

Windows可以在cmd下使用chcp命令查看當前使用的代碼頁,一般情況下都是936。

定義字元串的話有四種方式: 雙引號("")、單引號('')、反引號(``)和註釋符(/**/)。其中雙引號和反引號用法是一樣的

都可以定義多行字元串:

a = "1
2";
b = '1
2';
c = /*1
2*/

不同點:

  • 只有單引號可以使用轉義字元,例如'\n'表示換行。
  • 單引號的換行會被忽略,所以單引號表示換行時和c語言一樣使用轉義字元\n
  • 雙引號的換行會被替換成\n
  • 註釋符的換行會被替換成\r\n
  • 在雙引號中可以使用兩個雙引號表示雙引號本身,例如"1222""11111",則等同於'1222"11111'
  • 在單引號中\'表示單引號本身, 例如'1222\'11111',則等同於"1222'11111"
  • 'A'#表示這個字元的ASCII值,也就是65
  • 'UTF16字元串'u表示UTF-16 LE編碼的字元串
  • 文件路徑引號前加$符表示編譯後將文件嵌入到exe中,載入dll時經常會用到

全局函數

Python中有strintprint 這些可以使用的全局函數,aardio中也內置了一些可以全局使用的函數。我覺得用不到的就不在下麵列出來了

tostring

  • 將某個值轉換為字元串,如果是對象則調用_tostring元方法。
  • 第二個參數可以指定進位,比如tostring(10, 16)返回0xA
  • 如果第一個參數是時間,則第二個參數可以指定格式化時間的字元串,比如tostring(time(), "%Y-%m-%d %H:%M:%S")

topointer

將參數轉換為指針,這個函數我還沒用過。到時候用的時候再看什麼作用

tonumber

  • 將某個值轉換為數值,如果是對象則調用_tonumber元方法。
  • 如果是指針則返回記憶體地址
  • 如果是字元串, 第二個參數可以指定進位,例如tonumber("0xA", 16)

註意: 這個函數會返回兩個值,第一個是轉換後的數值。第二個是轉換使用的字元數。例如tonumber("12a"), 返回12和2.

一般會使用兩個值接收var a, b = tonumber("12a")

invoke

invoke(被調用函數, owner, 參數1, 參數2)

調用指定函數,owner這個後面再提

call

call(被調用函數, owner, 參數)

調用指定函數,跟invoke基本類似

callex

callex(異常處理函數,被調用函數, owner, 參數)

當被調用函數代碼出現異常時則調用異常處理函數

loadcode

載入編譯代碼,參數可以是代碼字元串或者代碼路徑

loadcodex

載入編譯和運行代碼,參數可以是代碼字元串或者代碼路徑

dumpcode

編譯代碼為二進位位元組

sleep

同步阻塞休眠,和Python的time.sleep一樣,單線程情況下會卡住界面。界面中應使用win.delay

type

用於獲取對象的數據類型,一般使用type(obj) == type.string來判斷對象是不是字元串,所有類型請看基礎語法中的基本數據類型

eval

運行aardio代碼,並返回表達式的值

error

主動拋出異常

參考

  • [1] aardio官方文檔: https://bbs.aardio.com/doc/reference/
  • [2] 標準代碼頁(codepage)列表: https://blog.csdn.net/jianggujin/article/details/80325461
  • Python所有全局函數: https://mp.weixin.qq.com/s/PA0lsojc-zkZ4eltj8P6Kg

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • OI 一場空,不開 long long 見祖宗 cmp,一定要在 sort 里寫入 打 st 表一定要算空間複雜度 打倍增 LCA 一定要算空間複雜度 註意 ÷0 線段樹 4 倍空間 無向圖,鏈式前向星 2 倍空間 樹鏈剖分要註意是原編號還是 dfn 序的編號 鏈式前向星遍歷圖的時間複雜度永遠為 + ...
  • 一、數據類型 定義: 就是用了保存數據的一個類型,一種數據類型,只能保存該類型數據值 作用: 只有瞭解數據類型,才能選擇合適的類型存放數據,才能更好的利用電腦硬體資源(記憶體和硬碟等)。 不同的數據類型存放數據大小是不同的。 數據類型的使用方式就是用來聲明一個變數,裝數據的。 常用的整數類型是 in ...
  • 在開發過程中,碰到需要在 Python Django 項目中連接到位於 ECS 上但未開通外網地址的 RDS 資料庫。 這種情況下,通過建立 SSH 隧道來實現連接,確保數據傳輸的安全性和可靠性。 1、安裝 sshtunnel 包 pip3 install sshtunnel 2、導入 SSHTun ...
  • 在MyBatis中,如果你使用resultType而不是resultMap,並且結果集中有同名欄位,則預設情況下後出現的欄位值會覆蓋前面的欄位值。這是因為MyBatis在將結果集映射到Java對象時,是按照欄位名稱一一對應進行賦值的。 但若你希望更精確地控制映射關係,並且避免自動覆蓋行為,則可以用r ...
  • 當開發者意識到代碼庫開始變得般混亂不堪時,就會在現有項目中引入狀態機。狀態機的引入有助於將複雜多變的應用程式狀態轉換過程組織得更為有序和清晰,從而避免代碼陷入難以維護的境地。 ...
  • 優秀可靠的數倉體系,需要良好的數據分層結構。合理的分層,能夠使數據體系更加清晰,使複雜問題得以簡化。以下是該項目的分層規劃。 1 設計要點 (1)ODS層的表結構設計依托於從業務系統同步過來的數據結構 (2)ODS層要保存全部歷史數據,故其壓縮格式應選擇壓縮比較高的,此處選擇gzip (3)ODS層 ...
  • 全面介紹雲計算安全的意義、安全模型、雲安全挑戰、雲安全最佳實踐和技術解決方案,最終深入研究雲安全案例,讓大家對雲安全有全面的理解。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能 ...
  • 我們在使用pandas處理完數據之後,最終總是要把數據作為一個文件保存下來,那麼,保存數據最常用的文件是什麼呢?我想大部分人一定會選擇csv或者excel。 剛接觸數據分析時,我也是這麼選擇的,不過,今天將介紹幾種不一樣的存儲數據的文件格式。這些文件格式各有自己的一些優點,希望本文能讓你以後的數據存 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...