aardio教程一) 基礎語法-下

Python成长路發表於2024-03-16

條件判斷語句

使用ifelseifelse來對變數或表示式進行判斷

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中的迴圈有whilefordo whilefor 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();//關閉控制檯

迴圈中斷語句

breakcontinue兩個語句,語法和其他語言中的基本一樣。

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 釋出!

相關文章