aardio教程一) 基礎語法-下

條件判斷語句

使用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 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章