亚洲中文字幕无码日韩精品,亚洲一区制服无码中字,亚洲精品第一国产综合精品99 ,一本大道中文日本香蕉

微立頂科技

新聞資訊

創(chuàng)新 服務(wù) 價(jià)值

  aardio 編程語(yǔ)言快速入門——語(yǔ)法速覽

發(fā)布日期:2022/8/11 10:34:18      瀏覽量:

本文僅供有編程基礎(chǔ)的用戶快速了解常用語(yǔ)法。如果『沒(méi)有編程基礎(chǔ)』 ,那么你可以通過(guò)學(xué)習(xí)任何一門編程語(yǔ)言去彌補(bǔ)你的編程基礎(chǔ),不同編程語(yǔ)言雖然語(yǔ)法不同 —— 編程基礎(chǔ)與經(jīng)驗(yàn)都是可以互通的。我經(jīng)??吹揭恍┬率终f(shuō)自己沒(méi)有編程基礎(chǔ)或經(jīng)驗(yàn),然后過(guò)了三年、五年,我看到他還是在說(shuō)自己沒(méi)有編程基礎(chǔ)或經(jīng)驗(yàn)。僅僅是掌握編程基礎(chǔ)知識(shí)或者積累基本的編程經(jīng)驗(yàn) —— 通過(guò)任何你喜歡的編程語(yǔ)言都不難做到。編程真正困難的并不是怎么拿到入場(chǎng)券 —— 而是如何寫出優(yōu)秀的軟件

有的新手跟我說(shuō):“我沒(méi)有編程基礎(chǔ),學(xué)了幾個(gè)小時(shí),都沒(méi)有掌握編程基礎(chǔ) ……你的文檔是怎么寫的,你的教程是怎么寫的 ……你們這些做編程語(yǔ)言的人到底是怎么想的 ……”。其實(shí)零基礎(chǔ)前提下只想花幾個(gè)小時(shí)就能學(xué)會(huì)一門新編程語(yǔ)言 —— 這只有百年不遇的天才能做到。aardio 很小也很簡(jiǎn)單。編寫 aardio 程序也很簡(jiǎn)單,幾句代碼就可以寫一個(gè)可運(yùn)行的程序,沒(méi)有任何復(fù)雜的操作。aardio 的文檔和教程對(duì)很多基礎(chǔ)知識(shí)都有講解,也提供了大量可直接運(yùn)行與使用的范例 —— 很適合新手。不止一次有用戶向我反饋,下載 aardio 只是簡(jiǎn)單地看了一下教程就把程序?qū)懗鰜?lái)了。 也有不少用戶向我反饋,嘗試學(xué)習(xí)過(guò)很多編程語(yǔ)言都沒(méi)有成功 —— 但是學(xué)習(xí) aardio 只用了很短的時(shí)間就找到感覺(jué)了。

 

第一個(gè)控制臺(tái)程序//導(dǎo)入庫(kù)import console;//加載動(dòng)畫console.showLoading("加載動(dòng)畫測(cè)試");sleep(1000); //暫停 1 秒//輸出字符串console.log(’測(cè)試字符串’);//輸出變量console.dump({a=123;b=456});//以 JSON 格式輸出變量console.dumpJson({a=123;b=456});//暫停并等待按鍵console.pause(true);第一個(gè)窗口程序import win.ui;/*DSG{{*/var winform = win.form(text="aardio form")winform.add(button={cls="button";text="測(cè)試";left=435;top=395;right=680;bottom=450;color=14120960;font=LOGFONT(h=-14);note="點(diǎn)這里";z=2};edit={cls="edit";left=18;top=16;right=741;bottom=361;edge=1;multiline=1;z=1}//按鈕回調(diào)事件winform.button.oncommand = function(){winform.edit.text = "測(cè)試"; //修改控件屬性//顯示窗口winform.show();//啟動(dòng)界面消息循環(huán),保持窗口顯示,并響應(yīng)用戶操作win.loopMessage();調(diào)用靜態(tài) API//加載 DLLvar dll = raw.loadDll("user32.dll");//調(diào)用 API 函數(shù)dll.MessageBox(0,"測(cè)試","標(biāo)題",0);

aardio 已經(jīng)默認(rèn)加載了一些常用的系統(tǒng) DLL 對(duì)象,例如 ::User32, ::Kernel32, ::Shell32,::Ntdll 等。

所以上面的代碼可以簡(jiǎn)化為:

::User32.MessageBox(0,"測(cè)試","標(biāo)題",0);靜態(tài)結(jié)構(gòu)體var info = {INT size = 8;INT time;::User32.GetLastInputInfo( info )

因?yàn)?aardio 函數(shù)支持多返回值,且結(jié)構(gòu)體默認(rèn)為傳址輸出參數(shù) —— 會(huì)添加到返回值中,所以上面的代碼也可以這樣寫:

var ok,info = ::User32.GetLastInputInfo( {INT size = 8;INT time;注釋語(yǔ)句// 單行注釋多行注釋,首尾星號(hào)數(shù)目必須相同。變量、賦值var n = null;var str = "字符串";

aardio 中的變量默認(rèn)為當(dāng)前名字空間變量,使用 var 語(yǔ)句可以定義局部變量。

語(yǔ)句、語(yǔ)句塊var n = null;var str = "字符串";

語(yǔ)句尾部可以加分號(hào)也可以不加。
語(yǔ)句塊首尾加 { } 標(biāo)記,var 語(yǔ)句支持語(yǔ)句塊作用域。

數(shù)值var num = 123.01; //10 進(jìn)制數(shù)值var hex = 0xEFEF; //16 進(jìn)制數(shù)值var num2 = 123_456; //可用下劃線作為分隔符var num3 = 2#010; //可在 # 號(hào)前自定義進(jìn)制算術(shù)運(yùn)算var num = 3 + 2; //加,值為 5var num = 3 - 2; //減,值為 1var num = 3 * 2; //乘,值為 6var num = 3 / 2; //除,值為 1.5var num = 3 % 2; //取模,值為 1var num = 3 ** 2; //乘方,值為 9位運(yùn)算import console;//按位取反var n = ~2#101;//顯示2#11111111111111111111111111111010console.printf("2#%b", n)//按位與var n = 2#101 & 2#100;//顯示2#100console.printf("2#%b", n)//按位或var n = 2#101 | 2#110;//顯示2#111console.printf("2#%b", n)//按位異或var n = 2#101 ^ 2#110;//顯示2#011console.printf("2#%b", n);//按位左移var n = 2#101 << 1;//顯示2#1010console.printf("2#%b", n);//按位右移var n = 2#101 >> 1;//顯示2#10console.printf("2#%b", n);//按位無(wú)符號(hào)右移var n = -2 >>> 18;//顯示 16383console.log(n);console.pause();字符串var str = "普通字符串??芍苯影瑩Q行符,不能包含回車符??梢杂?"" 表示一個(gè)雙引號(hào)。";var str2 = `反引號(hào)的作用與雙引號(hào)一樣。可直接包含換行符,不能包含回車符??梢杂?`` 表示一個(gè)反引號(hào)。`;var str3 = ’轉(zhuǎn)義字符串忽略回車換行,反斜桿作為轉(zhuǎn)義符使用例如 \r\n 表示回車換行’;var str4 = /*段注釋可以賦值為字符串。首尾星號(hào)數(shù)目必須配對(duì)。忽略首尾緊鄰星號(hào)的第一個(gè)空行(如果有的話),其他換行總是會(huì)規(guī)范化為回車換行符,也就是 ’\r\n’。var str5 = //行注釋也可賦值為字符串,不含回車換行//在文件路徑前加 $ 符號(hào),可將該文件編譯為字符串var str6 = $"~/aardio.exe"二進(jìn)制字符串、文本編碼var bin = ’字符串可以包含任意二進(jìn)制數(shù)據(jù),例如 \0’var UTF8 = "字符串可以包含文本,默認(rèn)為 utf-8 編碼"var utf16 = ’轉(zhuǎn)義字符串后加 u 字符表示 UTF-16 編碼字符串’u

aardio 在很多地方都支持自動(dòng)編碼轉(zhuǎn)換,例如調(diào)用 Unicode(UTF-16) 版本的 API 函數(shù)時(shí),UTF-8 字符串可自動(dòng)轉(zhuǎn)換為UTF-16 編碼字符串( 支持雙向自動(dòng)轉(zhuǎn)換),例如以下兩句代碼的作用是相同的:

::User32.MessageBox(0,"內(nèi)容","標(biāo)題",0);::User32.MessageBox(0,’內(nèi)容’u,’標(biāo)題’u,0);

在調(diào)用 ::User32.MessageBox 時(shí),aardio 會(huì)自動(dòng)檢測(cè)并優(yōu)先使用 Unicode 版本的 ::User32.MessageBoxW() 函數(shù)。當(dāng)然,也可以主動(dòng)在 API 函數(shù)名后加上大寫的 W 尾標(biāo)聲明這是 Unicode 版本函數(shù)(即使該函數(shù)名尾部并沒(méi)有 W,也可以添加 W 尾標(biāo))。

字符串連接//使用 ++ 操作符連接字符串var str = "字符串1" ++ "字符串2";//如果 ++ 前后有引號(hào),可省略一個(gè) + 號(hào)。var str = "字符串1" + "字符串2";//用 string.concat() 函數(shù)連接支持多參數(shù),支持 null 值var str = string.concat("字符串1","字符串2")讀寫文件//寫文件string.save("/test.txt","要保存在文件的字符串")//讀文件var str = string.load("/test.txt");文件路徑文件路徑開始可用單個(gè)斜杠(或反斜杠)表示應(yīng)用程序根目錄。應(yīng)用程序根目錄在開發(fā)時(shí)指工程目錄,發(fā)布后指 exe 目錄。var str = string.load("\res\test.txt");//文件路徑中正斜杠可自動(dòng)轉(zhuǎn)換為反斜杠var str = string.load("/res/test.txt");文件路徑開始用波浪線表示 exe 所在目錄。aardio 不需要生成 exe 就可以運(yùn)行調(diào)試,此時(shí)波浪線表示 aardio.exe 所在目錄。var str = string.load("~/res/test.txt");aardio 很多讀文件的函數(shù)都兼容工程內(nèi)嵌資源目錄。不需要修改代碼,所以 "\res\test.txt" 可以是資源目錄。如果讀取文件失敗,string.load() 會(huì)返回 null 值(不報(bào)錯(cuò))。var str = string.load("\res\test.txt");將文件轉(zhuǎn)換為完整路徑。將路徑傳給第三方組件時(shí),建議這樣轉(zhuǎn)換一下。var path = io.fullpath("\res\test.txt");

注意在 aardio 中雙引號(hào)內(nèi)不需要轉(zhuǎn)義反斜杠。所以不用寫為 “\\res\\test.txt”,單引號(hào)內(nèi)才需要這樣寫。

在 aardio 中一般不必要使用 “./dir/test.txt” 這樣的相對(duì)當(dāng)前目錄路徑。因?yàn)楫?dāng)前目錄可以任意更改,你不知道什么時(shí)候某個(gè)第三方組件是不是悄悄幫你改了當(dāng)前目錄。

嵌入文件到字符串

在文件路徑前加上 $ 操作符可將該文件編譯為字符串對(duì)象。
在編譯該代碼時(shí)文件必須存在,程序發(fā)布后就不再需要這個(gè)文件了。

示例:

var str = $"\dir\test.txt";

不要用這個(gè)方法包含資源目錄下的資源文件,
因?yàn)檫@等于將同一個(gè)文件重復(fù)包含了多次,會(huì)不必要地增加發(fā)布體積。

名字空間//導(dǎo)入其他庫(kù)文件,同時(shí)也導(dǎo)入該庫(kù)創(chuàng)建的名字空間import console;//打開名字空間namespace test.a.b{//定義當(dāng)前名字空間變量console = 123;//..console 等價(jià)于 global.console..console.log(console);console.pause(true);

默認(rèn)名字空間為全局名字空間,也就是 global 名字空間。在其他名字空間訪問(wèn) global 名字空間必須在變量前加上兩點(diǎn)( … ) 。例如 global.console 等價(jià)于 …console 。

在 aardio 中使用 import 導(dǎo)入其他庫(kù)文件,同時(shí)也導(dǎo)入該庫(kù)創(chuàng)建的名字空間。
導(dǎo)入名字空間只是引入模塊,訪問(wèn)該名字空間仍然要寫完整的名字空間路徑。

表 (table)

table(表)是aardio中唯一的復(fù)合數(shù)據(jù)類型,除了非復(fù)合的基礎(chǔ)數(shù)據(jù)類型以外,aardio 中幾乎所有的復(fù)合對(duì)象都是表,即使是變量的命名空間也是表。表的本質(zhì)是一個(gè)集合,可以用于容納其他的數(shù)據(jù)成員,并且表也可以嵌套的包含其他的表(table),在aardio里表幾乎可以容納一切其他對(duì)象。

表可以包含鍵值對(duì):

tab = {a = 123;str = "字符串";[123] = "不符合變量命名規(guī)則的鍵應(yīng)放在下標(biāo)內(nèi)。";["鍵 名"] = "不符合變量命名規(guī)則的鍵應(yīng)放在下標(biāo)內(nèi)。";鍵名 = {test = "表也可以包含表";

表也可以包含數(shù)組:

//在表中創(chuàng)建數(shù)組var array = {[1] = 123;[2] = "數(shù)組的值可以是任何其他對(duì)象";[3] = { "也可以嵌套包含其他表或數(shù)組"}//數(shù)組的鍵可以省略,下面這樣寫也可以(并且建議省略)var array = {123;"數(shù)組的值可以是任何其他對(duì)象";{ "也可以嵌套包含其他表或數(shù)組"}

在表中允許使用類 JavaScript 語(yǔ)法,用冒號(hào)代替等號(hào)分隔鍵值,用逗號(hào)代替分號(hào)分隔元素,并可用引號(hào)包含鍵名。

示例:

var tag ={"name1":123,"name2":456}

注意如果鍵名以下劃線開始,則為常量字段(值為 非 null 值時(shí)不可修改) —— 可通過(guò)元屬性 _readonly 禁用此規(guī)則(參考語(yǔ)法手冊(cè))。

成員操作符var tab = {a = 123; b = 456};用點(diǎn)號(hào)訪問(wèn)表成員,點(diǎn)號(hào)后面必須跟合法的標(biāo)識(shí)符var item = tab.a;用下標(biāo)操符符 [] 訪問(wèn)表成員,[] 里可以放任何表達(dá)式。var item = tab["a"];用直接下標(biāo)操符符 [[]] 訪問(wèn)表成員,[[]] 里可以放任何表達(dá)式。直接下標(biāo)不會(huì)觸發(fā)元方法,用于 null 值也會(huì)返回 null 而不是報(bào)錯(cuò)。var item = tab[["a"]];null 值

未定義的變量值默認(rèn)為 null 。
獲取表對(duì)象不存在的成員值時(shí)也會(huì)返回 null 而不會(huì)報(bào)錯(cuò)。
如果對(duì)象本身是 null 值,使用點(diǎn)號(hào)、普通下標(biāo)獲取成員值會(huì)報(bào)錯(cuò),改用直接下標(biāo) [[]] 則不會(huì)報(bào)錯(cuò),而是會(huì)返回 null 值。

用 # 操作符獲取 null 值長(zhǎng)度返回 0 而不是報(bào)錯(cuò)。

將表對(duì)象的成員賦值為 null 就可以刪除該成員。

在邏輯運(yùn)算中,null 值為 false。

取數(shù)組或字符串長(zhǎng)度import console;var array = {123;456};console.log("數(shù)組長(zhǎng)度",#array);var str = "abcd";console.log("字符串長(zhǎng)度",#str);var n = null;console.log("null 值長(zhǎng)度為 0",#n);console.pause();

使用 # 操作取數(shù)組或字符串的值,也可以取 null 值的長(zhǎng)度( 返回 0 )。

if 語(yǔ)句import console;var enabled = true;if (enabled) {console.log(’enabled 的值為 true’);console.pause(true);

注意在邏輯運(yùn)算中,非 0、非 null、非 false 為 true,反之為 false。

如果要準(zhǔn)確判斷一個(gè)變量的值是否為 true 或 false ,則應(yīng)使用恒等操作符,如下:

import console;var enabled = false;if (enabled === false ) {console.log(’enabled 的值為 false,不是 0,也不是 null’);elseif( enabled ){console.log(’enabled 的值為真’);else{console.log(’enabled 值為:’,enabled);console.pause(true);

上面的 elseif 也可以改為 else if。

邏輯操作符

邏輯非 既可以用 not 也可以用 ! 。
邏輯與 既可以用 and 也可以用 && 或者 ? 。
邏輯與 既可以用 or 也可以用 || 或者 : 。

aardio 語(yǔ)句在設(shè)計(jì)時(shí)試圖兼容其他語(yǔ)言的一些基本語(yǔ)法,所以很多語(yǔ)法有類似上面的替代寫法,例如可以用 begin end 替代 { } 包含語(yǔ)句塊。

三元運(yùn)算符var n = 1;// ret 值為 truevar ret = n ? true : 0;

要特別注意 ? 實(shí)際上是邏輯與操作符,: 實(shí)際上是邏輯或操作符。如果 a ? b : c 這個(gè)表達(dá)式里 b 為 false,則該表達(dá)式總是返回 c。這與其他類 C 語(yǔ)言的三元操作符不同,請(qǐng)注意區(qū)分。

定義函數(shù)//定義函數(shù):add = function(a, b) {return a + b,"支持多個(gè)返回值";//調(diào)用函數(shù)var num,str = add(1, 2);要特別注意,函數(shù)可以返回多個(gè)值。可以用 () 將多個(gè)返回值轉(zhuǎn)換為單個(gè)調(diào)用參數(shù)。var str = tostring( ( add(1, 2) ) );for 循環(huán)語(yǔ)句import console;for(i=1;10;1){console.log(i);console.pause();for in 循環(huán)語(yǔ)句import console;var tab = {a = 123;b = 456;for(k,v in tab){console.log(k,v)console.pause();while 循環(huán)語(yǔ)句import console;var i = 0;while (i < 100) {i++;console.log(i);if(i==10){break; //中止循環(huán)console.pause();while var 語(yǔ)句import console;//用法1,while條件中使用一個(gè)var語(yǔ)句while(var i = console.getNumber( "請(qǐng)輸入數(shù)值,輸入0退出:" )console.log( i )//用法2,while條件中使用var語(yǔ)句、循環(huán)前執(zhí)行語(yǔ)句、條件判斷語(yǔ)句while(var i;i = console.getNumber( "請(qǐng)輸入數(shù)值,輸入100退出:" );i != 100 ) {console.log( i )//用法3,省略var語(yǔ)句,僅使用循環(huán)前執(zhí)行語(yǔ)句、條件判斷語(yǔ)句var i = 0;while( ;i++; i<10 ) {console.log(i)//用法4,省略var語(yǔ)句,循環(huán)前執(zhí)行語(yǔ)句,僅使用條件判斷語(yǔ)句while(i>0){i--;console.log(i);console.pause(true);while var 模擬 for 循環(huán)import console;while( var i = 0; i++ ; i < 5 ) {console.log( i )console.pause(true);break label, continue label, break N, continue N 語(yǔ)句

break 語(yǔ)句中斷并退出當(dāng)前循環(huán)語(yǔ)句。
continue 語(yǔ)句跳過(guò)當(dāng)前循環(huán)體剩下的部分,繼續(xù)執(zhí)行下一次循環(huán)。

break label,continue label 通過(guò)為循環(huán)指定一個(gè)標(biāo)號(hào)以中斷指定的循環(huán)。
break N,continue N 通過(guò)指定循環(huán)語(yǔ)句的嵌套層次以中斷指定的循環(huán)。

import console;import console;var i, j;for (i = 0; 2; 1 ) { loop1:for (j = 0; 2; 1) { loop2:if (i == 1 && j == 1) {continue loop1;else {console.log("i = " + i + ", j = " + j);console.pause(true);

注意循環(huán)標(biāo)號(hào)寫在循環(huán)體內(nèi)部開始處。

//定義類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)建對(duì)象var obj = cls();//調(diào)用對(duì)象函數(shù)var v = obj.add(5);

類內(nèi)部可以用 this 訪問(wèn)當(dāng)前創(chuàng)建的實(shí)例對(duì)象。
類總是先調(diào)用構(gòu)造函數(shù) ctor 才會(huì)初始化其他成員。

每個(gè)類都有自己的名字空間。
類創(chuàng)建的所有實(shí)例共享同一名字空間。
類名字空間的成員也就是類的靜態(tài)成員。

self,this,owner

self 表示當(dāng)前名字空間。
this 在類內(nèi)部表示當(dāng)前創(chuàng)建的實(shí)例對(duì)象。

每個(gè)函數(shù)都有自己的 owner 參數(shù)( 無(wú)法使用外部函數(shù)的 owner 參數(shù) )。如果用點(diǎn)號(hào)作為成員操作符獲取并調(diào)用對(duì)象的成員函數(shù),則點(diǎn)號(hào)前面的對(duì)象是被調(diào)用成員函數(shù)的 owner 參數(shù),否則被調(diào)用函數(shù)的 owner 參數(shù)為 null。例如 obj.func() 調(diào)用 obj 的成員函數(shù) func,則 obj 是 obj.func 的 owner 參數(shù)。

注意一個(gè)獨(dú)立的 aardio 代碼文件編譯后也相當(dāng)于一個(gè)匿名的函數(shù)。獨(dú)立運(yùn)行的 aardio 代碼文件 owner 參數(shù)默認(rèn)為 null ,使用 import 語(yǔ)句加載的庫(kù)文件,owner 參數(shù)為加載路徑、或資源文件數(shù)據(jù)。

owner 在元方法中表示左操作數(shù)。

在迭代器函數(shù)中,owner 表示迭代目標(biāo)對(duì)象。

aardio 允許用 call, callex, invoke 等函數(shù)調(diào)用其他函數(shù)并改變 owner 參數(shù)的值。

aardio 制作的一些開源軟件

通用輸入法狀態(tài)提示工具 ImTip:

極簡(jiǎn)錄屏工具 Gif123:


系統(tǒng)五筆助手 WubiLex:




  業(yè)務(wù)實(shí)施流程

需求調(diào)研 →

團(tuán)隊(duì)組建和動(dòng)員 →

數(shù)據(jù)初始化 →

調(diào)試完善 →

解決方案和選型 →

硬件網(wǎng)絡(luò)部署 →

系統(tǒng)部署試運(yùn)行 →

系統(tǒng)正式上線 →

合作協(xié)議

系統(tǒng)開發(fā)/整合

制作文檔和員工培訓(xùn)

售后服務(wù)

馬上咨詢: 如果您有業(yè)務(wù)方面的問(wèn)題或者需求,歡迎您咨詢!我們帶來(lái)的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098     Phone: 13 9800 1 9844 / 135 6887 9550     聯(lián)系人:石先生/雷先生