條件判斷語句
使用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 發佈!