前言
想開(kāi)發(fā)一些小工具,所以想系統(tǒng)性的學(xué)習(xí)一遍aardio奋献,之前都是哪里不會(huì)搜哪里,順便寫(xiě)些教程旺上。我的主要語(yǔ)言是Python瓶蚂,所以會(huì)以Python作為對(duì)比來(lái)加深印象。
aardio的基礎(chǔ)語(yǔ)法和JavaScript基本類(lèi)似宣吱,如果你學(xué)過(guò)JavaScript窃这,aardio很容易上手。下面的文檔來(lái)自官方文檔 [1]
問(wèn)題搜索途徑
基礎(chǔ)語(yǔ)法看:https://bbs.aardio.com/doc/reference/
一些庫(kù)的使用征候,獲取文檔有以下途徑:
- aardio官方論壇(https://bbs.aardio.com)杭攻,我一般用谷歌搜索 site:bbs.aardio.com 搜索內(nèi)容
- aardio官方公眾號(hào)
- 打開(kāi)編輯器開(kāi)始頁(yè)的話(huà)有開(kāi)發(fā)指南和文檔資源,右側(cè)有官方資訊疤坝,剛?cè)腴T(mén)都可以看一下朴上。里面的庫(kù)函數(shù)文檔我經(jīng)常用
- 寫(xiě)一個(gè)函數(shù)的時(shí)候右鍵轉(zhuǎn)到定義,庫(kù)代碼下面一般都有注釋怎么用
- 用vscode打開(kāi)整個(gè)aardio軟件目錄卒煞,搜索你不知道怎么用的庫(kù)痪宰,看看官方是怎么使用的,這個(gè)我用的最多
- aardio相關(guān)的第三方論壇:https://aardio.online/thread-20.htm
語(yǔ)法
標(biāo)識(shí)符
變量標(biāo)識(shí)符的定義和Python基本一樣畔裕,語(yǔ)法如下:
- 字母(區(qū)分大小寫(xiě))衣撬、數(shù)字和下劃線(xiàn),也可以用中文
- 數(shù)字不能作為變量首個(gè)字符
與Python不同的點(diǎn):
- 除了單個(gè)下劃線(xiàn)
_
扮饶,其他下劃線(xiàn)開(kāi)頭的為常量具练,定義后無(wú)法被修改 - 可以以$符開(kāi)頭
- 包含中文時(shí),前面不能有字符和數(shù)字
關(guān)鍵字
- | - |
---|---|
var 用于定義局部變量 |
def 用于定義關(guān)鍵字 |
and not or 邏輯運(yùn)算符 |
begin end 用于包含語(yǔ)句塊 |
if else elseif 用于條件判斷語(yǔ)句 |
for in 用于循環(huán)語(yǔ)句 |
select case 用于條件判斷語(yǔ)句 |
try catch 用于捕獲異常 |
break continue 循環(huán)中斷語(yǔ)句 |
function 用于創(chuàng)建函數(shù) |
namespace 用于創(chuàng)建或打開(kāi)名字空間 |
import 用于引用庫(kù) |
this 用于在類(lèi)內(nèi)部表示當(dāng)前實(shí)例對(duì)象 |
global 用于表示全局名字空間 |
owner 用于表示調(diào)用函數(shù)的主體對(duì)象 |
while do 用于循環(huán)語(yǔ)句 |
null 用于表示空值 |
false true 用于表示布爾值 |
class ctor 用于創(chuàng)建類(lèi) |
return 用于函數(shù)中返回值 |
with 用于打開(kāi)名字空間 |
self 用于表示當(dāng)前名字空間 |
你如果閑的無(wú)聊的話(huà)甜无,也可以使用def
自定義關(guān)鍵詞扛点,比如:
def 如果 = if
def 否則 = else
def 否則是 = elseif
def 名字空間= namespace
def 循環(huán) = while
io.open();
如果 1== 1 {
io.print(" 1等于1 ")
}
否則{
io.print(" 1不等于1 ")
}
改個(gè)名字和圖標(biāo)哥遮,一款新的中文編程語(yǔ)言就寫(xiě)好了
分隔符和注釋符
分隔每條語(yǔ)句可以用換行或者分號(hào), 一下三種方法都可以:
var a = 1; var b = 2;
var a, b = 1, 2;
# 后面的分號(hào)可寫(xiě)可不寫(xiě),我一般都寫(xiě)上
var a = 1
var b = 2
注釋則是使用//
和/*
加*/
陵究,也可以使用多個(gè)/***
和***/
眠饮,只需要前面和后面的數(shù)量對(duì)應(yīng)上
操作符
算術(shù)運(yùn)算符 |
+ 加 |
- 減 |
* 乘 |
/ 除 |
** 冪 |
% 模 |
||
按位運(yùn)算符 |
~ 取反 |
& 與 |
` | ` 或 |
^ 異或 |
<< 左移 |
>> 右移 |
|
等式運(yùn)算符 | == |
!= |
||||||
邏輯運(yùn)算符 |
! not
|
` |
or :` |
&& and ?
|
||||
關(guān)系運(yùn)算符 | > |
< |
>= |
<= |
||||
連接運(yùn)算符 | ++ |
|||||||
取長(zhǎng)運(yùn)算符 | # |
|||||||
全局變量定義 | :: |
|||||||
成員操作符 | . |
[] |
[[]] |
|||||
包含操作符 | $ |
|||||||
- 字符串之間使用關(guān)系運(yùn)算符時(shí),是從第一個(gè)字符開(kāi)始比較铜邮,這個(gè)和Python也是一樣的
-
++
并不是c語(yǔ)言里面的自增仪召,而是用于字符串和字符串拼接,或者字符串和數(shù)值拼接松蒜。例如:1 ++ "2" == "12"
,也可以省略成1+"2"
- 取長(zhǎng)運(yùn)算符用于獲取字符串和數(shù)組長(zhǎng)度扔茅,如果是對(duì)象則調(diào)用
_len
元方法 - 在變量名前面加
::
表示為全局常量,比如::Kernel32 := raw.loadDll("Kernel32.dll");
秸苗,可以避免重復(fù)加載dll - 成員操作符.和[]基本可以混用召娜,除非成員名稱(chēng)不符合aardio命令規(guī)定則使用[]
- [[]]一般是在元方法中使用,它不會(huì)調(diào)用元方法惊楼,可以避免無(wú)限遞歸
- 路徑字符串前加
$
符表示內(nèi)嵌該文件到編譯后的exe中
邏輯運(yùn)算符
||
玖瘸、or
和:
再使用上基本沒(méi)有區(qū)別,大部分情況下可以互相替換胁后。
- 邏輯與和邏輯或運(yùn)算符就能組成類(lèi)似三元運(yùn)算符的效果
true ? 1 : 0
-
a := 1
等同于a = a : 1
,可以用于避免重復(fù)賦值 -
a ?= f(a)
等同于a = a ? f(a)
嗦枢,可以只當(dāng)a不為null執(zhí)行f(a) - 也有像Python一樣的用邏輯運(yùn)算符做條件取值的操作攀芯,比如
a = 1 or 2
、b = 0 or 3
文虏。語(yǔ)法和意思也和Python是一樣的
按位無(wú)符號(hào)右移
a >>> n
將數(shù)值a按位向右移動(dòng)n位(如果n大于等于32侣诺,則為n對(duì)32取模結(jié)果的位數(shù)) ,不保留符號(hào)位(負(fù)數(shù)不保持最高位為1氧秘,因此右移后會(huì)變成正數(shù))
實(shí)際用途:
可以通過(guò)右移 0 位將有符號(hào)數(shù)強(qiáng)制轉(zhuǎn)換為無(wú)符號(hào)數(shù)年鸳。例如 -1 >>> 0 的值為 0xFFFFFFFF , 其作用等價(jià)于 raw.convert( {int value = -1},{INT value}).value。
不聲明調(diào)用靜態(tài) API 默認(rèn)會(huì)返回 32位有符號(hào)整數(shù)丸相,如果原 API 返回的是 32位無(wú)符號(hào)整數(shù)搔确,那么只要簡(jiǎn)單的將返回值 >>> 0 就可以得到原來(lái)的無(wú)符號(hào)數(shù)值了
這里有一點(diǎn)很重要: 內(nèi)存里的數(shù)據(jù)都是0和1,它是什么值只取決于你以什么類(lèi)型讀取它灭忠。
等式運(yùn)算符
基礎(chǔ)數(shù)據(jù)類(lèi)型會(huì)判斷值是否相等膳算,而非基本類(lèi)型則是判斷對(duì)象是否相等或者調(diào)用_eq
元方法判斷
元方法類(lèi)似Python的魔法方法,可以重載對(duì)象的符號(hào)運(yùn)算弛作,比如_eq
重載==
涕蜂。
0, null
與 false
相等,其他類(lèi)型都與true
想等
跟數(shù)值類(lèi)型比較時(shí):
- 字符串會(huì)自動(dòng)轉(zhuǎn)為數(shù)值類(lèi)型再做比較映琳,空字符串""轉(zhuǎn)為0机隙,空白字符
\r\n\t
也是轉(zhuǎn)為0 - 如果是對(duì)象蜘拉,則是調(diào)用
_tonumber
元方法轉(zhuǎn)數(shù)值
表達(dá)式 | 結(jié)果 |
---|---|
"123"==123 |
true |
"abc"==123 |
false |
""==0 |
true |
'\r\n\t '==0 |
true |
null==0 | false |
還有一個(gè)恒等判斷的符號(hào)===
和!==
,它不會(huì)調(diào)用_eq
元方法有鹿,直接判斷類(lèi)型和數(shù)值都相等
運(yùn)算符優(yōu)先級(jí)
這個(gè)東西沒(méi)必要記旭旭,有疑問(wèn)時(shí)加括號(hào)即可。遇到別人的代碼有疑問(wèn)印颤,可以運(yùn)行測(cè)試下
基礎(chǔ)數(shù)據(jù)類(lèi)型
類(lèi)型 | 舉例值 | 說(shuō)明 |
---|---|---|
type.null |
null | |
type.boolean |
布爾值 | |
type.number |
數(shù)值 | 默認(rèn)為64位浮點(diǎn)數(shù) |
type.string |
字符串 | 字符串和Python也基本一樣您机,utf-8編碼 |
type.buffer |
raw.buffer | 可用于接收c語(yǔ)言char* 數(shù)據(jù) |
type.pointer |
指針 | 接收dll返回的指針數(shù)據(jù),或者使用topointer(obj)
|
type.table |
表 | aardio中的數(shù)組年局、字典等復(fù)雜類(lèi)型 |
type.function |
函數(shù) | function創(chuàng)建的函數(shù) |
type.cdata |
內(nèi)核對(duì)象 | 一般不用關(guān)心 |
type.fiber |
纖程 | 沒(méi)用過(guò) |
type.class |
類(lèi) | class關(guān)鍵詞創(chuàng)建的類(lèi) |
null
任何沒(méi)有定義或賦值的變量默認(rèn)都是null际看。如果函數(shù)不傳參數(shù),默認(rèn)傳過(guò)去的也是null矢否。
import console;
console.dump(a);
console.pause(true);
import console;
function f(a){
console.dump(a);
}
f()
console.pause(true);
數(shù)值類(lèi)型
-
2#11
表示二進(jìn)制數(shù)仲闽,8#11
表示八進(jìn)制數(shù),16#A
表示十六進(jìn)制數(shù)僵朗,也可以表示為0xA
赖欣。 -
2e+20
(2x10**20)表示科學(xué)計(jì)數(shù)法,+
僅表示指數(shù)的正負(fù),可加可不加 - 可以用
_
來(lái)分隔數(shù)值验庙,111_222
等同于111222
字符串
aardio中定義的字符串都是utf-8編碼
string.fromUnicode(s)
顶吮、string.toUnicode(s)
可以做utf-8 <=> utf-16
的轉(zhuǎn)換,Windows上使用的Unicode編碼一般就是指的utf-16粪薛,兩個(gè)函數(shù)都可以指定第二個(gè)參數(shù)悴了,代表目標(biāo)編碼的代碼頁(yè),用于轉(zhuǎn)換其他編碼违寿。
常用的代碼頁(yè): 936(gb2312)湃交、1200(utf-16 le)、1201(utf-16 be)藤巢、65001(utf-8)搞莺。所有代碼頁(yè)可以參考: 標(biāo)準(zhǔn)代碼頁(yè)(codepage)列表 [2]
Windows可以在cmd下使用chcp
命令查看當(dāng)前使用的代碼頁(yè),一般情況下都是936掂咒。
定義字符串的話(huà)有四種方式: 雙引號(hào)("")才沧、單引號(hào)('')、反引號(hào)(``)和注釋符(/**/)绍刮。其中雙引號(hào)和反引號(hào)用法是一樣的
都可以定義多行字符串:
a = "1
2";
b = '1
2';
c = /*1
2*/
不同點(diǎn):
- 只有單引號(hào)可以使用轉(zhuǎn)義字符糜工,例如
'\n'
表示換行。 - 單引號(hào)的換行會(huì)被忽略录淡,所以單引號(hào)表示換行時(shí)和c語(yǔ)言一樣使用轉(zhuǎn)義字符
\n
- 雙引號(hào)的換行會(huì)被替換成
\n
- 注釋符的換行會(huì)被替換成
\r\n
- 在雙引號(hào)中可以使用兩個(gè)雙引號(hào)表示雙引號(hào)本身捌木,例如
"1222""11111"
,則等同于'1222"11111'
- 在單引號(hào)中
\'
表示單引號(hào)本身, 例如'1222\'11111'
嫉戚,則等同于"1222'11111"
-
'A'#
表示這個(gè)字符的ASCII值刨裆,也就是65 -
'UTF16字符串'u
表示UTF-16 LE編碼的字符串 - 文件路徑引號(hào)前加$符表示編譯后將文件嵌入到exe中澈圈,加載dll時(shí)經(jīng)常會(huì)用到
全局函數(shù)
Python中有str
、int
帆啃、print
這些可以使用的全局函數(shù)瞬女,aardio中也內(nèi)置了一些可以全局使用的函數(shù)。我覺(jué)得用不到的就不在下面列出來(lái)了
tostring
- 將某個(gè)值轉(zhuǎn)換為字符串努潘,如果是對(duì)象則調(diào)用
_tostring
元方法诽偷。 - 第二個(gè)參數(shù)可以指定進(jìn)制,比如
tostring(10, 16)
返回0xA
- 如果第一個(gè)參數(shù)是時(shí)間疯坤,則第二個(gè)參數(shù)可以指定格式化時(shí)間的字符串报慕,比如
tostring(time(), "%Y-%m-%d %H:%M:%S")
topointer
將參數(shù)轉(zhuǎn)換為指針,這個(gè)函數(shù)我還沒(méi)用過(guò)压怠。到時(shí)候用的時(shí)候再看什么作用
tonumber
- 將某個(gè)值轉(zhuǎn)換為數(shù)值眠冈,如果是對(duì)象則調(diào)用
_tonumber
元方法。 - 如果是指針則返回內(nèi)存地址
- 如果是字符串, 第二個(gè)參數(shù)可以指定進(jìn)制菌瘫,例如
tonumber("0xA", 16)
注意: 這個(gè)函數(shù)會(huì)返回兩個(gè)值蜗顽,第一個(gè)是轉(zhuǎn)換后的數(shù)值。第二個(gè)是轉(zhuǎn)換使用的字符數(shù)雨让。例如tonumber("12a")
, 返回12和2.
一般會(huì)使用兩個(gè)值接收var a, b = tonumber("12a")
invoke
invoke(被調(diào)用函數(shù), owner, 參數(shù)1, 參數(shù)2)
調(diào)用指定函數(shù)雇盖,owner這個(gè)后面再提
call
call(被調(diào)用函數(shù), owner, 參數(shù))
調(diào)用指定函數(shù),跟invoke基本類(lèi)似
callex
callex(異常處理函數(shù),被調(diào)用函數(shù), owner, 參數(shù))
當(dāng)被調(diào)用函數(shù)代碼出現(xiàn)異常時(shí)則調(diào)用異常處理函數(shù)
loadcode
加載編譯代碼栖忠,參數(shù)可以是代碼字符串或者代碼路徑
loadcodex
加載編譯和運(yùn)行代碼崔挖,參數(shù)可以是代碼字符串或者代碼路徑
dumpcode
編譯代碼為二進(jìn)制字節(jié)
sleep
同步阻塞休眠,和Python的time.sleep一樣娃闲,單線(xiàn)程情況下會(huì)卡住界面虚汛。界面中應(yīng)使用win.delay
type
用于獲取對(duì)象的數(shù)據(jù)類(lèi)型匾浪,一般使用type(obj) == type.string
來(lái)判斷對(duì)象是不是字符串皇帮,所有類(lèi)型請(qǐng)看基礎(chǔ)語(yǔ)法中的基本數(shù)據(jù)類(lèi)型
eval
運(yùn)行aardio代碼,并返回表達(dá)式的值
error
主動(dòng)拋出異常
參考
- [1] aardio官方文檔:
https://bbs.aardio.com/doc/reference/
- [2] 標(biāo)準(zhǔn)代碼頁(yè)(codepage)列表:
https://blog.csdn.net/jianggujin/article/details/80325461
- Python所有全局函數(shù):
https://mp.weixin.qq.com/s/PA0lsojc-zkZ4eltj8P6Kg