條件判斷語句
使用if
、elseif
和else
來對變數或表示式進行判斷
io.open() //開啟控制檯
var a=1
if(a==1){
io.print("if")
}
elseif(a==11){
io.print("elseif")
}
else{
io.print("else")
}
也可以使用select
對變數或表示式進行判斷,也就是JavaScript中的switch
語句,有一點不同的是,無需每個case都寫一個break。
io.open() //開啟控制檯
var a = 1;
select( a ) {
case 1 { //判斷 1===a 是否為真
io.print("a==1")
//其他程式碼
}
case 1,9,10 { //判斷 a 是否其中的一個
io.print("a是1,9,10其中之一")
}
case 10;20 { //判斷 ( 10<=a and a <=20 ) 是否為真
io.print("a在10到20的範圍")
}
case "a"{ // 也可以判斷字串相等
io.print("a等於'a'")
}
case !=0{ //判斷 a是否不等於0,這是自已指定關係運算子的示例
io.print("a不等於0")
}
else{ //所有條件不符時執行else語句塊
io.print("a是其他值(0)")
}
}
迴圈語句
aardio中的迴圈有while
、for
、do while
和for in
,而while又有兩種語法
第一種(和其他語言語法一樣):
while(表示式){
}
第二種(和其他語言for
語法類似,不一樣的是條件判斷語句在第三個語句裡):
while( var 初始化迴圈變數列表;判斷條件前執行語句;條件判斷語句 ) {
//需要迴圈執行的語句
}
do while
和其他語言是一樣的
do{
//需要迴圈執行的語句
} while( 條件判斷語句 )
for
迴圈則有點像Python中的for in range
for( 計數器變數= 初始數值; 最大數值; 步進數值) { //步進可以省略,預設值為1。
//需要迴圈執行的語句
}
舉個例子:
io.open();
for( i=1;10;2 ){ //計數器i從1迴圈到10,每次遞增2
io.print(i)
}
//支援修改計數器變數
for( i=1;10;1 )begin
i++;//如果你將i賦值為非數字,在下次迴圈以前將會被自動恢復為計數器值
end;
//遞減計數器
for( i=1;-10;-1 )begin
io.print(i)
end;
execute("pause") //按任意鍵繼續
io.close();//關閉控制檯
迴圈中斷語句
有break
和continue
兩個語句,語法和其他語言中的基本一樣。
aardio中還增加了一個標號,來指定在巢狀迴圈中中斷哪一層迴圈,比如break 1
表示中斷當前迴圈,break 2
表示中斷上一層迴圈,你也可以在迴圈開始時指定一個標號(例子如下)。continue
也是類似語法
這個額外的語法只需要做了解即可,實際我也沒用到過,可能是寫其他語言已經習慣了,也會避免寫多層迴圈。
io.open(); //開啟控制檯
while( true ){ 迴圈體2: //可以在迴圈體的開始指定一個標號
io.print("迴圈體2開始" );
while( true )begin
io.print("迴圈體1開始" );
break 2;//中斷上層迴圈
break 迴圈體2; //這句的作用與上面的break作用是一樣的
io.print("迴圈體1結束" );
end;
io.print("迴圈體2結束" );
}
execute("pause") //按任意鍵繼續
io.close();//關閉控制檯
異常捕獲
try catch
,一般很少會用到,要想程式夠健壯,需要做很多次判斷。如果用try來捕獲所有語句,雖然程式不報錯了,但還是沒有正常執行。
有個特殊的情況需要使用,有時候用一些多執行緒庫的時候,即使某個執行緒報錯了,程式確沒有任何提示,控制檯也不會列印異常,這個時候就需要用try來看看是執行緒裡的哪個語句出錯了
io.open(); //開啟控制檯視窗
try{
b="aaaaaaaaaaaa" *2
io.print("錯誤會中斷try語句塊")
}
catch(e){ //catch部分可以省略
io.print( "錯誤資訊:",e )
//在這裡可以呼叫debug庫
//在棧釋放以前呼叫錯誤處理
//所以可以呼叫debug庫中的函式收集錯誤相關的資訊
}
io.print("錯誤不會中斷程式")
函式
定義函式
function f1(a, b){
io.print(a, b);
}
// 將一個匿名函式賦值給了一個變數
f2 = function(a, b){
io.print(a, b);
}
成員函式
成員函式和普通函式基本一樣,只是可以透過owner訪問成員變數
tab = {};
tab.函式名字 = function( 形參列表 ) {
//函式內部內碼
}
tab = {x=1};
function tab.函式名字( 形參列表 ) {
//函式內部內碼
io.print(owner.x);
}
可變引數
function f1(...){
var kwargs = {...};
console.dump(kwargs)
}
f1(1, 2, 3);
f1(1, 2);
關鍵詞引數
aardio並不支援關鍵詞引數,只能透過傳整個表當引數
function f1(kwargs){
console.dump(kwargs);
}
f1({a=1;b="2"});
// 大括號也可以省略
f1(a=1;b="2");
返回值
函式可以返回多個值,接收的時候可以定義多個變數來接收,例如:var a,b = f();
當函式有很多個返回值時,你這個時候又只需要其中幾個,則可以使用rget
來獲取區間內的返回值
例如:
//開啟控制檯
io.open()
//定義一個函式
func = function(){
return 1,2,3; //函式有多個返回值
}
var re,re2 = rget(2,func() ) //從第二個引數開始返回, re==2,re2==3
io.print( re,re2 )
var re,re2 = rget(-1,func() ) //從倒數第一個引數開始返回, re==3,re2==null
io.print( re,re2 )
lambda(匿名函式)
因為aardio本身就支援在定義函式時不指定函式名,例如: function(){}
。這樣定義匿名函式更方便和理解,所以lambda實際並不需要使用
變數作用域
Python中定義一個變數後可以在函式的任意一個位置使用這個變數
for i in range(10):
a = 1
print(a)
而aardio中使用var定義的區域性變數作用域只限於當前語句塊。
io.open()
while(true){
var a = 1;
break;
}
// 這個時候a就已經是null了
console.log(a)
namespace(名字空間)
namespace和Python模組的含義基本一樣, 它其實就是個盒子,盒子裡可以放你想放的函式或者變數,訪問時透過名稱+點+變數名
來訪問, 例如:
namespace module{
a = 1;
}
io.print(module.a)
global
是預設的全域性名字空間,aardio程式碼檔案載入時,預設都執行在global名字空間。self
表示當前名字空間
匯入名字空間(import)
和Python的匯入庫也基本類似,aardio的查詢路徑優先順序:
- 核心庫,aardio核心提供的庫,如string、raw等
- 標準庫,位於aardio根目錄下的lib目錄下,庫路徑與名字空間路徑完全一致
- 使用者庫,當前工程下的lib目錄
- 擴充套件庫, 如果是開發環境(用編輯器啟動沒有編譯成exe),還會查詢擴充套件庫列表。如果擴充套件庫有的話,會提示你是否安裝
本文由部落格一文多發平臺 OpenWrite 釋出!