# 控制流语法

可以使用两个减号表示--后面的当前行内容是注释,也就是不作为代码处理

# if/else

条件判断语法,后面跟着真假值,比如nil/false都是假值,其他的值都是真值,else表示不满足情况下执行的代码,是可选的语句,例如

var a = {}
if false then       
    print('false')
elseif nil then
    print('ni')
elseif 2 > 1 then
    print('2>1')
elseif a then
    print('a')
else
    print('else')
end

或者
if a then
    print('a')
end

# for

循环遍历语句,

有2种for语法,第一种是for v = e1, e2, e3 do block end 形式,其中e1是v的初始值,e2是v的结束值(v超过e2时结束循环),e3是每次遍历对v的增加的值,e3可以是负数,e3是可选的,默认是1

比如

for v=1,10,2 do
    print(v)
end

还有一种for语法是for var_1, ···, var_n in f, step do block end 这种形式的, var_1到var_n是若干个用来循环的变量名, 每次遍历都把step和var_1到var_n的值作为参数传给函数f,结果赋值给var_1,..., var_n.一直循环直到f(step, var_1, ..., var_n)的返回值是nil为止, 比如

var a

let f = function(s: number, v: number)
    if not v then
        return 1
    elseif v > 10 then
        return nil
    else
        return v + s
    end
end

for a in f, 2 do
    print(a)
end

let t1 = [1,2,3]
for k: int, v: int in pairs(t1) do   -- 这里的pairs的用来遍历Map<T>, Array<T>, table的全局函数,按key排序遍历
    pprint(k, v)
end

# while/break

语法结构while exp do block end,满足exp条件就可以继续执行block的代码块,其中也可以使用break语句来跳出循环

比如

var a = 1
while a < 10 do
    a = a + 1
    print(a)
    if a > 8 then
        break
    end
end

# repeat

语法结构repeat block until exp,重复执行block的代码块,直到满足exp为真值,其中也可以使用break语句来跳出循环

比如

local a = 1
repeat
    a = a + 1
    print(a)
until a >= 10

# goto

可以通过 labelName的语法定义label,然后函数中其他位置通过goto labelName进行跳转,从而实现控制流的无条件转移.

比如

var i = 0 
s1 
do
    print(i)
    i = i+1
end
if i>3 then
    goto end_of_file
end

goto s1

end_of_file
print("this is end")

# and

逻辑操作符,如果左右2个表达式都是真值,结果才是真值,比如true and false结果是false, true and true结果才是true

# or

逻辑操作符,左右2个表达式有一个是真值,结果就是真值,比如true of false结果是真值,false or false结果是false

# not

逻辑操作符,和右边的表达式的布尔值相反,比如not false值为true