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