本文同步發表於個人網站
Lua的關鍵字並不多,就只有這麼幾個而已:
and | break | do | else | elseif | end |
false | for | function | goto | if | in |
local | nil | not | or | repeat | return |
then | true | until | while |
有一些關鍵字會組合成程式區塊(block)。像是:
funciton
- end
do
- end
if-then
- end
while-do
- end
repeat
- until
夾於這些關鍵字中間的程式碼會成為一個環境區塊。
在區塊環境內,可以保有一些局部變數:
do
local name = "World"
print("Hello, "..name)
end
print(name)
Hello, World
nil
不過一個執行單位實際上是一個chunk。
load([[
do
local name = "World"
print("Hello, "..name)
end]])()
chunk也是block,可以保有自己的局部變數。
load([[
local name = "World"
print("Hello, "..name)
]])()
print(name) --> nil
區塊由多個語句組成。一個最簡單的空語句是;
儘管可以這樣寫:
io.write("Hello, ") ;io.write("World\n")
不過Lua會自動忽略空白、tab等。所以寫法相當自由:
io.write("Hello, ") io.write("World\n")
還可以更簡單的這樣寫:
io.write "Hello, " io.write "World\n"
還記得最開始的Hello, World?
print "Hello, World"
關於糖果還有:
print("Hello, World")
print "Hello, World"
print 'Hello, World'
print [[Hello, World]]
print [==[Hello, World]==]
print {"Hello, Wolrd"}
雖然你可以這樣子寫:
print
"Hello, World"
但是下面結果可能與你想的不同:
a = b + c
(print or io.write)('done')
這相當於
a = b + c(print or io.write)('done')
但你可能會想要
a = b + c;(print or io.write)('done')
所以最好:
a = b + c
;(print or io.write)('done')
整體而言,Lua語法限制不太多,但最好還是好好縮排。
Lua之所以能夠高效,我認為一部分歸功於其token代表的意義幾乎是唯一的,這使得解析器相對簡單。儘管如此,也定義了許多語法糖,甜到寫個簡單的DSL絕對沒問題。