aardio 是一種易用性極強(qiáng)的動(dòng)態(tài)語(yǔ)言,aardio官網(wǎng):https://aardio.com/
基礎(chǔ)語(yǔ)法
1.命名空間
- 使用 namespace 關(guān)鍵字定義名字空間。如果一個(gè)不存在的變量首次被賦值(var語(yǔ)句聲明的局部變量除外),則會(huì)自動(dòng)加入到當(dāng)前名字空間。
- 名字空間也可以省略語(yǔ)句塊標(biāo)記,表示名字空間作用域直至該代碼文件結(jié)束。
- 名字空間其實(shí)也是一個(gè)普通的table對(duì)象。訪問(wèn)非當(dāng)前名字空間的成員變量,可以加上有效的名字空間前綴.訪問(wèn)頂層名字空間要使用..操作符
- global為默認(rèn)的全局名字空間,當(dāng)aardio代碼文件加載時(shí),默認(rèn)都運(yùn)行在global名字空間。self表示當(dāng)前名字空間。
- import語(yǔ)句可以將外部名字空間導(dǎo)入當(dāng)前名字空間
- 提示
- 局部變量申明用var語(yǔ)句定義,若不使用var,則此變量申明為當(dāng)前名字空間成員變量。
2.import語(yǔ)句
- import語(yǔ)句將一個(gè)外部名字空間導(dǎo)入到當(dāng)前名字空間,import 語(yǔ)句首先會(huì)在當(dāng)前名字空間下查找同名對(duì)象是否存在,查找時(shí)不會(huì)觸發(fā)名字空間的元方法
aardio的庫(kù)有三種:
- 內(nèi)核庫(kù)(Kernel Libraries),內(nèi)核庫(kù)由aardio提供,例如string庫(kù),raw庫(kù)等。
- 標(biāo)準(zhǔn)庫(kù)(Standard Libraries),標(biāo)準(zhǔn)庫(kù)由 aardio開(kāi)發(fā)環(huán)境 提供。位于aardio根目錄下的lib目錄下,庫(kù)路徑與名字空間路徑完全一致。
- 用戶庫(kù)(User Libraries),用戶庫(kù)是用戶在aardio應(yīng)用程序根目錄下的lib目錄下建立的庫(kù)。庫(kù)路徑與名字空間路徑完全一致。
如果是程序入口是打開(kāi)工程內(nèi)的代碼文件,根目錄為工程目錄,否則為啟動(dòng)aardio文件所在目錄。
相關(guān)文檔:https://bbs.aardio.com/doc/reference/libraries/import.html
3.類
類可以動(dòng)態(tài)創(chuàng)建數(shù)據(jù)結(jié)構(gòu)相同的table對(duì)象。每一個(gè)類擁有獨(dú)立的名字空間,名字空間中的變量也就是類的公用靜態(tài)成員。在類內(nèi)部,可以使用this對(duì)象引用動(dòng)態(tài)創(chuàng)建的對(duì)象。
//定義類
class cls{
//構(gòu)造函數(shù)
ctor(name,...){
this.name = name;
this.args = {...}
};
//屬性
value = staticNum;
//成員函數(shù)
add = function(v){
this.value = this.value + v;
return this.value;
}
}
//打開(kāi)類的名字空間
namespace cls{
staticVar = "類的靜態(tài)變量值";
staticNum = 2;
}
//調(diào)用類創(chuàng)建對(duì)象
var obj = cls();
//調(diào)用對(duì)象函數(shù)
var v = obj.add(5);
提示
當(dāng)一個(gè)table對(duì)象調(diào)用成員函數(shù)時(shí),默認(rèn)會(huì)傳遞一個(gè)owner對(duì)象給函數(shù)。
而在類創(chuàng)建的對(duì)象成員函數(shù)里,owner對(duì)象與this對(duì)象是指向同一個(gè)對(duì)象。
this對(duì)象與owner對(duì)象的區(qū)別在于。
this是類內(nèi)部指向當(dāng)前創(chuàng)建對(duì)象的指針,this指針不會(huì)因?yàn)楹瘮?shù)的table前綴改變而改變。而owner對(duì)象是會(huì)根據(jù)函數(shù)調(diào)用時(shí)函數(shù)名前綴的table對(duì)象而相應(yīng)改變。
4.元表
- 使用元表可以自定義對(duì)象的默認(rèn)行為、操作符。
- 一個(gè)table對(duì)象可以用另一個(gè)table對(duì)象(元表)來(lái)定義一些元方法(metamethods)。用來(lái)定義元方法的表稱為元表(metatable)。元表(metatable)允許我們改變表(table)的行為。例如對(duì)兩個(gè)表(table)進(jìn)行相加時(shí),它會(huì)檢查兩個(gè)表是否有一個(gè)表有元表(metatable),并且檢查元表(metatable)是否有_add函數(shù)。如果找到則調(diào)用這個(gè)_add函數(shù)去計(jì)算結(jié)果。
tab = {
@{ //使用@操作符設(shè)置元表
_get = function(k) begin
io.print(k)
return owner[[k]] //不調(diào)用元方法
end;
_float = true; //允許移除元表
}
}
tab@ = {}; //也可以這樣設(shè)置元表
tab@ = {}; //這句會(huì)出錯(cuò),因?yàn)樵頉](méi)有指定_float屬性時(shí)不能被移除
f = tab@._get; //讀取元表
相關(guān)文檔:https://bbs.aardio.com/doc/reference/libraries/kernel/table/meta.html
[[]] 是一個(gè)raw操作符,它與[]不同的是,它不會(huì)調(diào)用元方法,也就是不能重載。
5.消息循環(huán)
Windows是以消息驅(qū)動(dòng)的操作系統(tǒng),Windows 消息提供了應(yīng)用程序與應(yīng)用程序以及應(yīng)用程序與Windows系統(tǒng)之間進(jìn)行通訊的手段。 Windows 中有一個(gè)系統(tǒng)消息隊(duì)列,對(duì)于每一個(gè)正在執(zhí)行的Windows應(yīng)用程序,系統(tǒng)為其建立一個(gè)“消息隊(duì)列”,即應(yīng)用程序消息隊(duì)列,用來(lái)存放該程序可能創(chuàng)建的各種窗口的消息。
在aardio窗口程序中,調(diào)用win.loopMessage啟動(dòng)窗口消息循環(huán),用來(lái)從程序的消息隊(duì)列中檢索窗口消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中?!跋⒀h(huán)”,實(shí)際也就是是程序循環(huán),win.loopMessage退出,則窗口程序終止。
當(dāng)我們用鼠標(biāo)、按鍵等在窗口上操作時(shí),windows就會(huì)將相應(yīng)的操作轉(zhuǎn)換為消息并加入到消息隊(duì)列中。而win.loopMessage就檢索這些消息并將之分發(fā)給窗口函數(shù)(消息回調(diào)函數(shù)wndproc、以及事件函數(shù)oncommand)
在一個(gè)GUI線程(窗口線程)中只能啟動(dòng)一次win.loopMessage循環(huán),重復(fù)調(diào)用win.loopMessage不會(huì)啟動(dòng)多個(gè)循環(huán)。默認(rèn)win.loopMessage是不需要參數(shù)的。
當(dāng)我們指定observer參數(shù)為一個(gè)函數(shù)時(shí),則win.loopMessage將該函數(shù)注冊(cè)成為消息觀察者。每次從消息隊(duì)列中取出消息時(shí),win.loopMessage首先會(huì)通知所有的observer(消息觀察者)。如果調(diào)用 win.loopMessage( observer,false ) ,則將消息觀察者observer從觀察隊(duì)列中注銷。
6.操作符
aardio操作符優(yōu)先級(jí)與C系語(yǔ)言基本兼容,也有很多自己的操作符
- ++, 字符串連接符
- [[]],直接下標(biāo)操作符,獲取或設(shè)置對(duì)象成員,不會(huì)調(diào)用元方法。
- #,取字符串長(zhǎng)度、或table數(shù)組元素個(gè)數(shù)。
- @,@操作符表示元表,table的元表可以是table自已。例: tab@ = tab;
- $,包含操作符可以將外部文件鏈接到當(dāng)前代碼中。
- ..,兩個(gè)點(diǎn)表示調(diào)用頂層命名空間下的成員。
- ...,使用三個(gè)連續(xù)的圓點(diǎn)表示任意個(gè)數(shù)、任意類型的參數(shù) arg = { ... }
- _,如果在一個(gè)成員變量的前面加上下劃線,則聲明該變量的值為只讀,在賦值后不可修改
- “”,"/",在 aardio 中文件路徑如果以單個(gè)斜桿或反斜桿開(kāi)始表示『應(yīng)用程序根目錄』。
- “~”,"~/",如果文件以 "~" 右單個(gè)斜杠或反斜杠開(kāi)始表示啟動(dòng)EXE 所在目錄。
7.全局成員
- _ARGV ,解析后的進(jìn)程啟動(dòng)參數(shù)表
- _CMDLINE命令行參數(shù)的原始文本
- call(),調(diào)用函數(shù),可自定義owner對(duì)象
- error,拋出一個(gè)異常。
- publish("__/*發(fā)布消息名*/"),在當(dāng)前線程內(nèi)發(fā)布消息
- subscribe,訂閱消息設(shè)置回調(diào)
- tostring,對(duì)象轉(zhuǎn)字符串
語(yǔ)法
1.基礎(chǔ)語(yǔ)法
//遍歷元組
for(k,v in tab){
}
//計(jì)數(shù)器i從1循環(huán)到10,每次遞增2
for( i=1;10;2 ){
}
//while
while (true) {
}
標(biāo)準(zhǔn)庫(kù)
1.win
win 庫(kù)主要提供 Windows 系統(tǒng)函數(shù)、本進(jìn)程窗口操作函數(shù)。相關(guān)文檔:https://bbs.aardio.com/doc/reference/libraries/std/win.html
- win.form,窗口類,實(shí)例化生產(chǎn)一個(gè)窗口。
- win.loopMessage,啟動(dòng)窗口消息循環(huán)。
- win.msgbox,彈出消息提醒框。
- win.msgboxTest,彈出一個(gè)詢問(wèn)框
- win.find,查找指定的窗口句柄
- win.closed,返回當(dāng)前窗口是否關(guān)閉
win.form相關(guān)方法:
- winform.setTimeout,延時(shí)執(zhí)行定時(shí)器
- winform.setInterval,指定一個(gè)函數(shù),并定時(shí)執(zhí)行
- winform.show,顯示窗口
- winform.clearInterval、clearTimeout
- win.delay(),在界面線程中延時(shí)并同時(shí)處理窗口消息
- winform.wndproc,監(jiān)聽(tīng)窗口消息,設(shè)置消息處理的回調(diào)函數(shù)
- 窗口消息
- 是指Windows發(fā)出的一個(gè)通知,告訴應(yīng)用程序某個(gè)事情發(fā)生了。例如,單擊鼠標(biāo)、改變窗口尺寸、按下鍵盤上的一個(gè)鍵都會(huì)使Windows發(fā)送一個(gè)消息給應(yīng)用程序。消息本身是作為一個(gè)記錄傳遞給應(yīng)用程序的,這個(gè)記錄中包含了消息的類型以及其他信息。例如,對(duì)于單擊鼠標(biāo)所產(chǎn)生的消息來(lái)說(shuō),這個(gè)記錄中包含了單擊鼠標(biāo)時(shí)的坐標(biāo)。
2.process
process庫(kù)提供進(jìn)程管理函數(shù) ,process是一個(gè)類,用于創(chuàng)建進(jìn)程對(duì)象。相關(guān)文檔:https://bbs.aardio.com/doc/reference/libraries/std/process/process.html
- process( "exe執(zhí)行2文件路徑",啟動(dòng)參數(shù), startInfo),創(chuàng)建進(jìn)程對(duì)象
- proc.free(),關(guān)閉用來(lái)控制當(dāng)前進(jìn)程的內(nèi)核對(duì)象,并非關(guān)閉目標(biāo)進(jìn)程(停止運(yùn)行)
- prcs.write(cmd),寫(xiě)入數(shù)據(jù)
- proc.terminate(),強(qiáng)制殺除當(dāng)前進(jìn)程,使之停止運(yùn)行.
- process.execute(),執(zhí)行指定的exe程序
- process.kill(),終止指定的進(jìn)程
3.com
com(Component Object Model組件對(duì)象模型)是開(kāi)發(fā)軟件組件的一種方法。com組件實(shí)際上是一些小的二進(jìn)制可執(zhí)行程序,它們可以給應(yīng)用程序,操作系統(tǒng)以及其他組件提供服務(wù)。
- com.CreateObject,創(chuàng)建Com對(duì)象
- com.GetObject,返回已運(yùn)行的Com對(duì)象
- com.ShowHelp,查找Com對(duì)象的幫助文檔
- com.DumpTypeInfo,輸出Com對(duì)象的類型信息、成員屬性、成員方法列表
4.io
系統(tǒng)內(nèi)輸入、輸出相關(guān)的功能
- io.open(),顯示控制臺(tái)窗口,默認(rèn)打開(kāi)控制臺(tái)窗口以后,標(biāo)準(zhǔn)輸入輸出的目標(biāo)是控制臺(tái)窗口。。
- io.close(),關(guān)閉控制臺(tái)窗口。
- io.getText(),讀取控制臺(tái)的用戶輸入。
文件路徑和文件操作:
- io.fullpath(),把相對(duì)路徑轉(zhuǎn)換為絕對(duì)路徑,并且支持用""或"/"作為首字符表示aardio程序根目錄.
- io.exist(),判斷指定路徑文件是否存在,判斷目錄權(quán)限
- io.splitpath(),獲取指定路徑的信息,返回一個(gè)Table(文件名、目錄、擴(kuò)展名)
- io.createDir("/__"),創(chuàng)建目錄
- io.remove("__"),刪除參數(shù)@1指定路徑的文件,此函數(shù)僅用于刪除文件,刪除目錄請(qǐng)改用 fsys.delete、fsys.deleteEx 或 fsys.remove 函數(shù)。
- io.rename("__",""),重命名指定文件
- io.open 打開(kāi)文件,成功返回文件對(duì)象
- io.popen,運(yùn)行控制臺(tái)程序,并且得到返回的內(nèi)容
- io._exedir,主程序所在目錄,返回完整長(zhǎng)路徑,目錄路徑以反斜杠結(jié)尾
- io._exefile,主程序文件名
- io._exepath,主程序文件路徑,返回完整長(zhǎng)路徑
5.debug
debug 屬于內(nèi)核庫(kù),但必須使用 import debug 導(dǎo)入才能使用
- debug.callcount(),函數(shù)調(diào)用棧深度
- debug.debug(),插入斷點(diǎn),執(zhí)行到該位置時(shí)打開(kāi)控制臺(tái)進(jìn)入調(diào)試環(huán)境,發(fā)布后程序忽略此函數(shù)不執(zhí)行
6.preg
preg是Perl兼容正則表達(dá)式支持庫(kù)
- preg("w+","uis"),創(chuàng)建正則表達(dá)式對(duì)象
- preg.exec,類js
- preg.find,返回匹配字符串起始位置,結(jié)束位置,
- preg.grep,類php
- preg.match,類php
7.thread
多線程相關(guān)文檔:https://bbs.aardio.com/forum.php?mod=viewthread&tid=13625
- thread.create,創(chuàng)建線程,返回句柄、線程ID,線程函數(shù)有獨(dú)立的全局變量環(huán)境,線程引用的庫(kù)應(yīng)當(dāng)在線程函數(shù)內(nèi) import
- thread.delay,延時(shí)指定時(shí)間執(zhí)行線程,導(dǎo)入 win 庫(kù)的界面線程內(nèi)會(huì)執(zhí)行 win.delay,否則執(zhí)行 sleep 函數(shù)。
- thread.invoke,創(chuàng)建線程,但是不創(chuàng)建句柄,調(diào)用完畢自動(dòng)釋放
- thread.lock("臨界區(qū)名稱"),獲取一個(gè)鎖,沒(méi)有拿到時(shí),會(huì)一直阻塞等待
- thread.unlock("臨界區(qū)名稱"),釋放鎖
- thread.table,線程共享表
- thread.set("標(biāo)志鍵" )、thread.get("標(biāo)志鍵"),進(jìn)程的共享內(nèi)存
- thread.wait()、waitAll(),等待指定線程句柄的線程運(yùn)行結(jié)束
- thread.waitClose(),等待指定線程句柄的線程運(yùn)行結(jié)束,并釋放句柄
8.thread.command
線程創(chuàng)建雖然傳遞的是閉包,但是不能引用外部的變量,線程有著自己?jiǎn)为?dú)的作用域,可以將外部函數(shù)掛載到thread.command內(nèi),所以線程都可以進(jìn)行調(diào)用。
- thread.command(),創(chuàng)建線程命令訂閱對(duì)象
- thread.command.命令函數(shù)名(),如果命令函數(shù)名首字符為$以post模式異步調(diào)用命令,否則以send模式同步調(diào)用該命令
9.console
console庫(kù)用打開(kāi)控制臺(tái),以及和控制臺(tái)交互的一些操作。
- console.getText,輸出文字并獲取用戶輸入
- console.log,輸入指定的字符串
- console.pause,暫停
- console.dumpTable,輸出table
- console.dumpJson,輸出Json
10.web.json
- web.json.parse,解析json為table
- web.json.stringify,table轉(zhuǎn)json
11.sys
- sys.getComputerName(),返回計(jì)算機(jī)名
- sys.getStartTime(),返回系統(tǒng)啟動(dòng)時(shí)間
- sys.getUserName(),返回當(dāng)前登錄用戶名
- sys.hibernate(),休眠
- sys.lock(),鎖定計(jì)算機(jī)
- sys.logoff(),注銷
- sys.restart(),重啟
- sys.setComputerName("計(jì)算機(jī)名"),修改計(jì)算機(jī)名,重啟后生效
- sys.shutdown(),關(guān)機(jī)
- sys.sleep(),睡眠
12.environment
- environment.each(),獲取當(dāng)前應(yīng)用環(huán)境變量的迭代器
- environment.system(),獲取系統(tǒng)環(huán)境變量操作對(duì)象
- environment.user() ,獲取用戶環(huán)境變量操作對(duì)象
13.string
- getenv(),讀取當(dāng)前進(jìn)程環(huán)境變量
- setenv(),設(shè)置當(dāng)前進(jìn)程環(huán)境變量
- slice(),字符串截取
- split(),字符串分割
- string.load,加載文件內(nèi)容
- string.save,寫(xiě)入指定內(nèi)容到文件
12.fsys
文件系統(tǒng)、注冊(cè)表、Hosts、文件與目錄操作相關(guān)的模塊。
- fsys.copy,復(fù)制文件或目錄
- fsys.createDir,創(chuàng)建目錄并返回創(chuàng)建成功的完整文件路徑
- fsys.delete,刪除文件或目錄,成功返回 true
- fsys.getCurDir(),獲取當(dāng)前目錄。
- fsys.enum 遍歷指定目錄下的文件和目錄
13.time
- time(),獲取當(dāng)前時(shí)間。返回時(shí)間對(duì)象。
- time.stamp(),取 Unix 時(shí)間戳。
14.fsys.dlg
系統(tǒng)文件對(duì)話框。
- fsys.dlg.open,打開(kāi)選擇單文件對(duì)話框
- fsys.dlg.openEx,打開(kāi)選擇多文件對(duì)話框
- fsys.dlg.save,顯示保存文件對(duì)話框框
- fsys.dlg.saveOp,顯示保存文件對(duì)話框框,覆蓋已存在的文件時(shí)顯示確認(rèn)對(duì)話框(overwrite prompt)
- fsys.dlg.openDir,打開(kāi)選擇目錄對(duì)話框,支持xp
- fsys.dlg.dir,打開(kāi)選擇目錄對(duì)話框
15.win.dlg.message
封裝了一些簡(jiǎn)單的消息提示框。
- win.dlg.message(),創(chuàng)建一個(gè)消息提示框操作對(duì)象
- winMsg.ask,顯示詢問(wèn)框
- winMsg.doModal,顯示模態(tài)框
窗口控件
1.treeview
- treeview.getSelection(),獲取所有被選項(xiàng)
2.edit
- editObject.appendText ,追加文本并移動(dòng)光標(biāo)到文本尾部
- editObject.clear,清空所有內(nèi)容
- editObject.print,將多個(gè)參數(shù)轉(zhuǎn)換為字符串,并使用制表符分隔各參數(shù)追加到文本尾部,并追加換行
- editObject.text,編輯控件文本屬性
- editObject.vScroll(),滾動(dòng)到底部
問(wèn)題記錄
1.CDP協(xié)議
/* 設(shè)置這倆,才能進(jìn)行別的頁(yè)面操作 */
wb.cdpWait("Network.enable"); //啟用網(wǎng)絡(luò)跟蹤,網(wǎng)絡(luò)事件現(xiàn)在將傳遞到客戶端。
wb.cdpWait("Page.enable"); //允許操作
wb.cdpWait("Page.setBypassCSP", { enabled = true}); //禁用CSP
wb.cdpWait("Page.addScriptToEvaluateOnNewDocument", {source = extra}); //每次頁(yè)面加載時(shí)注入JS
2.字符串編碼轉(zhuǎn)換
// 怪異字符編碼轉(zhuǎn)換
import com.interface.IMultiLanguage2;
var mlang = com.interface.IMultiLanguage2.Create()
var str = mlang.fromto(all,936);
//正常字符串編碼轉(zhuǎn)換
string.fromto("轉(zhuǎn)換編碼",65001,0)
3.常用目錄
string.getenv("USERPROFILE"); //用戶目錄
io._exedir; //主程序所在目錄
4.excel
excel操作:https://bbs.aardio.com/forum.php?mod=viewthread&tid=5637&highlight=excel
給人點(diǎn)贊,回報(bào)無(wú)窮!