腳本語言Lua小試(安裝及簡單語法)

學習之餘瀏覽一下大神陳皓的酷殼網,不經意看到這篇《Lua簡明教程》,於是想嘗試一下這個很輕量級的腳本,也號稱性能最高的腳本語言。

一、Lua 語言簡介

Lua英語發音:/ˈlə/程序設計語言是一個簡潔、輕量、可擴展的腳本語言,是葡萄牙語中“Luna”(月亮)的意思。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)裏的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發(已經有20多個年頭咯)。 其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。Lua由標準C編寫而成,幾乎在所有操作系統和平臺上都可以編譯,運行。

Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作爲開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平臺上的即時編譯功能。[1]


二、Lua 安裝

網上搜了一下,好像sudo apt-get、install lua5.2就可以。

我是在Lua官網下載安裝包安裝的(我下載的lua-5.2.3.tar.gz):

1. tar -xvf lua-5.2.3.tar.gz cd lua-5.2.3 進入目錄
long@zhouyl:~/Public/lua-5.2.3$ ls
       doc  Makefile  README  src
很明顯,Linuxer在看到README的情況下毋庸置疑的要看一下:
long@zhouyl:~/Public/lua-5.2.3$ cat README

This is Lua 5.2.3, released on 11 Nov 2013.

For installation instructions, license details, and
further information about Lua, see doc/readme.html.
這個README寫的很簡單,沒有我們預想的那樣寫了如何安裝或者如何使用等,但是它寫明瞭想要學習Lua的更多信息,查看doc/readme.html文件,所以……  chromium-browser doc/readme.html打開看看唄。不出所料,打開的網頁中有着About / Installing / Changes ...,所以我們略讀一遍就能知道如何安裝。


2. make linux (這裏make後跟着平臺,我們當然要跟着linux咯)
不幸的是……報錯了:“ error:readline/readline.h:no such file or directory ”
之前的博客中,我寫過使用apt-file查詢這種缺失文件的方法,有興趣可以看看《cyclictest 測試以及原理淺談》一文,在其中有詳細的apt-file使用。
apt-file search readline | grep readline.h
可以很輕鬆地在結果中找到這條:
“ libreadline6-dev: /usr/include/readline/readline.h ”,所以apt-get安裝之(sudo apt-get install libreadline6-dev)!

安裝完成後,再使用 make linux 非常順利!


3. sudo make install
此時,Lua已經安裝完畢,我們可以使用這個神奇的腳本語言Lua了:
long@zhouyl:~/Public/lua-5.2.3$ lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> print("Hello World")
Hello World
>

作爲一個腳本語言,它當然也可以寫到腳本文件中運行:

long@zhouyl:/tmp/test$ cat hello.lua
#!/usr/local/bin/lua
print("Hello World")
long@zhouyl:/tmp/test$ lua hello.lua 
Hello World
long@zhouyl:/tmp/test$ chmod +x hello.lua 
long@zhouyl:/tmp/test$ ./hello.lua 
Hello World
long@zhouyl:/tmp/test$ 


三、Lua 語言基礎

3.1 註釋

-- 兩個橫線開始單行註釋


--[[ 
     加上兩個[和]表示

    多行註釋

--]]

3.2 變量類型

Lua是一種動態類型語言,因此語言中沒有類型的定義,不需要聲明變量類型,每個變量自己保存了類型。Lua有八種基本類型:

數值(number)        內部以double表示,Lua的數字只有double型,64bits,你不必擔心Lua處理浮點數會慢(除非大於100,000,000,000,000),或是會有精度問題
字符串(string)       總是以零結尾,但可以包含任意字符(包括零),因此並不等價於C字符串,而是其超集。字符串你可以用單引號,也可以用雙引號或者上面註釋時用到的[[ ]](類似於Python中的三引號,可以用於定義多行的字符串),還支持C類型的轉義,比如: ‘\a’ (響鈴), ‘\b’ (退格), ‘\f’ (表單), ‘\n’ (換行)>, ‘\r’ (回車), ‘\t’ (橫向製表), ‘\v’ (縱向製表), ‘\\’ (反斜槓), ‘\”‘ (雙引號), 以及 ‘\” (單引號)
布爾(boolean)       只有“true”或者“false”兩個值。數字0、''空字符串('\0')都是true!
函數(function)       Lua的關鍵概念之一。不簡單等同於C的函數或函數指針。
表(table)                異構的Hash表。Lua的關鍵概念之一。
userdata                用戶(非腳本用戶)定義的C數據結構。腳本用戶只能使用它,不能定義。
線程(thread)          Lua協作線程(coroutine),與一般操作系統的搶佔式線程不一樣。
nil                            代表什麼也沒有,可以與C的NULL作類比,但它不是空指針。你訪問一個沒有聲明過的變量,就是nil。例如 foo = anUnknownVariable  現在 foo = nil。 只有false和nil是false,其他的都是true,上面提到過包括0和空字符串在內都是true。

> print(type(nil))
nil
> print(type(99.9+12))
number
> print(type(true))
boolean
> print(type("Hello World"))
string
> print(type(print))
function
> print(type{test = "test"})
table
要注意的是:lua中的變量如果沒有特殊說明,全是全局變量,那怕是語句塊或是函數裏。變量前加local關鍵字的是局部變量
theGlobalVar = 50
local theLocalVar = "local variable"

3.3 流控制

Lua中使用do和end等關鍵字標示出程序塊: 

while 循環

while num < 50 do 
  num = num + 1  -- 沒有 ++ or += 運算符。 
end 

If 語句: 
if num > 40 then
        print('over 40')
elseif    s ~= 'walternate' then  -- ~= 表示不等於。像Python一樣,== 表示等於,適用於字符串。 
        io.write('not over 40\n')  -- 默認輸出到stdout。   
else 
        -- 默認變量都是全局的。
        thisIsGlobal = 5  -- 通常用駝峯式定義變量名。
        -- 如何定義局部變量:
        local line = io.read()  -- 讀取stdin的下一行。
        -- ..操作符用於連接字符串:
        print('Winter is coming, ' .. line)
end 

and 和 or

Lua中的'or'和 'and'都是可短路的,和python中一樣, 我們也可以使用 a and b or c 得到類似於C/js裏的 a?b:c 操作符: 

ans = aBoolValue and 'yes' or 'no'  

for 循環

karlSum = 0 
for i = 1, 100 do  -- 範圍包括兩端 
      karlSum = karlSum + i 
end 

-- 使用 "100, 1, -1" 表示遞減的範圍: 
fredSum = 0 
for j = 100, 1, -1 do fredSum = fredSum + j end 

範圍表達式爲begin, end[, step]。類似於python中的range()。

until 循環: 
repeat 
        print('the way of the future') 
        num = num - 1 
until num == 0 

3.4 函數

Lua的函數定義同shell中類似,使用function關鍵字,end結束:

遞歸

function fib(n)
  if n < 2 then return 1 end
  return fib(n - 2) + fib(n - 1)
end


閉包
示例一
function newCounter()
    local i = 0
    return function()     -- anonymous function
        i = i + 1
        return i
    end
end
 
c1 = newCounter()
print(c1())  --> 1
print(c1())  --> 2

示例二
function myPower(x)
    return function(y) return y^x end
end
 
power2 = myPower(2)
power3 = myPower(3)
 
print(power2(4)) --4的2次方
print(power3(5)) --5的3次方

Lua 語言支持多值同時賦值:name,Age = "Zhou",12,所以Lua的函數返回值也多返回值(同python挺像):

#!/usr/local/bin/lua
function getUserInfo(id)
    print(id)
    return "Zhou", 24
end

name, age = getUserInfo()   -- 使用多個變量接收函數返回值
print(name)
print(age)
print(getUserInfo(123))     -- 直接打印函數的多個返回值
print(getUserInfo(123)[1])  -- 嘗試一下是否支持python式的使用數
組方式選擇返回值的部分
程序寫的很簡單,那麼運行結果如何?

long@zhouyl:/tmp$ lua aa.lua 
nil           -- 沒有帶參數,打印id時打印空
Zhou  
24
123         -- 打印id
Zhou	24       -- 輸出多返回值
123         
nil            -- 並不支持選取返回值的部分,所以還是乖乖用變量接收返回值比較好

3.5 Table

所謂Table其實就是一個Key Value的數據結構,就像python或者其他語言中的Dict(字典),Table是Lua中的唯一的數據結構:

long@zhouyl:~$ lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> zhou = {name="Zhou Yunlong",age=24,home="AH"}
> print(zhou.name)  -- 通過key打印value
Zhou Yunlong
> zhou.hope="gf"    -- 可以直接添加
> print(zhou.hope)
gf
> for key,value in pairs(zhou) do   -- 遍歷Table
  print(key,value)
end
hope    gf
age 24
name    Zhou Yunlong
home    AH
> 


四、說在最後的話

本文只是在看到陳皓大神的博文後,對Lua腳本語言的一些簡單測試,感覺還挺有意思的,這個神奇、簡單、高效的語言也走過了20多個年頭。

但是Lua與python不同的是,python有着龐大豐富的庫,而Lua的庫並不多,所以Lua一般用來作爲一種嵌入式腳本語言,使用過Lua的項目(很多遊戲中使用到)也是令人矚目,包括偉大的魔獸世界的插件中也是使用到Lua。但是本文只做了一些簡單的語言規則的描述,以後如果有時間還是看看這門神奇的語言。下面貼出一些在網上學習Lua的好資源,如果你有興趣,不妨玩玩?!


================

引用:

[1] http://baike.baidu.com/link?url=zG3bYWFojdkaOefWrkPZFH9TkBIOmQqSDtuD9YgzwBx_h6eeGKsJx3brHfPrwvpL

[2] http://coolshell.cn/articles/10739.html 

[3] http://tylerneylon.com/a/learn-lua/

更多學習:

關於Lua的標庫,你可以看看官方文檔:string,  table, math, io, os


 


發佈了90 篇原創文章 · 獲贊 434 · 訪問量 106萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章