說明:
這個文檔是 doc 目錄裏的 manual.html 文件。
原文版權歸原做者全部,這篇翻譯只是做爲學習之用。若是翻譯有不當之處,請參考原文。
-------------------如下是正文-------------------
編程語言 Lua4.0 的參考手冊
--------------------------------------
1 簡介
--------------------------------------
Lua 是一個擴展編程語言,支持通用編程功能與數據描述功能。做爲一個強大,輕量級的配置語言,它被設計用來作爲別的程序的配置語言。
Lua 被實現爲由 C 語言寫成的庫。作爲一個擴展語言,Lua 沒有 "main" 函數的概念;它只能嵌入到宿主運行,叫作嵌入程序。宿主能夠調用函數去執行一段 Lua 代碼,能夠讀寫 Lua 變量,能夠註冊被 Lua 代碼調用的 C 函數。經過 C 函數的使用,Lua 能夠擴展本身以應對不一樣的領域,從而建立可定製、共享語法框架的編程語言。
Lua 是自由分發的軟件,正常提供沒有什麼保證,如它的版權聲明所述。本文檔裏描述的這個實現能夠從下面的地址獲得:
http://www.lua.org/
(原文的地址已通過期,這裏給出的是當前的官網地址)
如同其它的參考手冊同樣,這個文檔也很枯燥。一些 Lua 設計背後的決策討論能夠參見下面的論文,它們均可以在官網上找到。
> R. Ierusalimschy, L. H. de Figueiredo, and W. Celes. Lua-an extensible extension language. Software: Practice & Experience 26 #6 (1996) 635--652.
> L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. The design and implementation of a language for extending applications. Proceedings of XXI Brazilian Seminar on Software and Hardware (1994) 273--283.
> L. H. de Figueiredo, R. Ierusalimschy, and W. Celes. Lua: an extensible embedded language. Dr. Dobb's Journal 21 #12 (Dec 1996) 26--33.
--------------------------------------
2 環境和塊
--------------------------------------
Lua 中全部的語句都在一個全局環境中執行。這個環境由嵌入程序調用 lua_open 初始化並一直持續到調用 lua_close 結束,或者到嵌入程序結束時結束。若是必要的話,宿主程序員能夠創建多個獨立的全局環境,並能夠在它們之間自由的切換(參見 5.1 節)。
這個全局環境能夠用 Lua 代碼或者嵌入程序來管理,能夠經過 Lua 的實現庫 API 函數來讀寫全局變量。
Lua 中的全局變量不須要聲明。全部的變量被認爲是全局的除非明確聲明爲 local (參見 4.4.6 節)。在第一次賦值以前,全局變量的值爲 nil(能夠修改這個默認值,參見 4.8 節)。一個表(table)保存全部的全局名字和值(表的解釋參見 3 節)。
Lua 的執行單元叫作塊(chunk) 。簡單地說,一個塊就是一個按順序執行的語句序列。每一個語句能夠可選的後跟一個分號:
chunk ::= {stat [`;']}
語句在 4.4 節描述。(上面的符號標記法是通用的擴展的 BNF,{ a } 表示 0 個或多個 a,[ a ] 表示一個可選的 a,{ a } +(加號是右上角標)表示一個或多個 a。完整的語法描述在本文檔的最後面。)
一個模塊能夠保存在一個文件中或者一個宿主程序的字符串中。當執行一個模塊,首先它被預編譯爲虛擬機的字節碼,而後它的語句由模擬的虛擬機順序執行。模塊對於全局環境的全部修改是持久的,這些修改在模塊結束後依然可見。
塊可被預編譯爲二進制格式並保存在文件中;參見程序 luac。包含塊代碼的文本文件和它們的二進制預編譯字節碼形式是等價的。Lua 能夠自動檢測文件類型並作相應操做。
--------------------------------------
3 類型和標籤(Types and Tags)
--------------------------------------
Lua 是動態類型語言。這意味着變量沒有類型;只有值有類型。因此,Lua 語言中沒有類型定義。全部值含有本身的類型。除了類型,全部值還有一個標籤(tag)。
Lua 中有六種基本數據類型:nil, number, string, function, userdata, 和 table。Nil 是值爲 nil 的類型,它的主要性質就是和其它值不一樣。Number 表示實數(雙精浮點型),string 是字符串。Lua 是 8 位的,因此字符串能夠包含全部的 8 位字符,包括內部的 0 ('\0')(參見 4.1 節)。type 函數返回描述給定值的類型的字符串(參見 6.1 節)。
Lua 中函數是第一類值(first-class values)。這意味着他們能夠存儲在變量中,作爲參數傳遞給其餘函數或者作爲結果返回。Lua 能夠調用(和操縱)寫在 Lua 或 C 中的函數。這兩種函數能夠由它們的標籤區分:全部的 Lua 函數有相同的標籤,全部的 C 函數也有相同的標籤,而且不一樣於 Lua 函數的標籤。tag 函數能夠返回給定值的標籤(參見 6.1 節)。
userdata 類型容許 Lua 變量保存任意的 C 指針(void*)。它至關於 C 語言中的 void* 型指針,因此在 Lua 中除賦值和相等測試操做之外,沒有其它預約義的操做。可是,經過使用標籤方法(tag methods),程序員能夠爲 userdata 值定義操做(參見 4.8 節)。
table 類型實現爲關聯數組,即數組不只能夠用數字索引,也能夠用任意值索引(除了 nil)。所以,該類型不只可用於表示普通數組,也能夠用於表示符號表,集合,記錄等。表是 Lua 中主要的數據類型。爲表示一個記錄,Lua 使用字段名爲下標。語言經過提供 a.name 這種表示做爲 a["name"] 的語法糖。表也能夠包含方法。由於函數是第一類的,表字段能夠包含函數。t:f(x) 形式是 t.f(t,x) 的語法糖,它調用表 t 中的方法 f ,並把它本身作爲第一個參數傳入(參見 4.5.9 節)。
注意 table 是對象而非值。變量不能包含 table,只能引用它。賦值,參數傳遞,返回老是會操做 table 的引用,而不會對 table 進行拷貝。並且,table 必須在使用前顯式建立(參見 4.5.7 節)。
每個類型 nil, number, 和 string 有不一樣的標籤。全部這些類型的值有一樣的預約義標籤。正如上面解釋的同樣,類型 function 的值能夠有兩個不一樣的標籤,根據它們是 Lua 函數或者 C 函數。最後,類型 userdata 和 table 能夠有程序員指定的可變的標籤(參見 4.8 節)。tag 函數返回給定值的標籤。用戶標籤由函數 newtag 生成。settag 函數用來改變表的標籤(參見 6.1 節)。userdata 值的標籤只能在 C 中設置(參見 5.7 節)。當有事件發生時,標籤主要用來選擇標籤方法(tag methods)。標籤方法是擴展 Lua 語義的主要機制(參見 4.8 節)。
(未完待續)html