Lua 強效補丁 |
|
歡迎新的強效補丁、將現有補丁移植到不同 Lua 版本以及錯誤修復。
如果您應用了一個更改 Lua 語法或語義的補丁,則產生的語言不應稱為“Lua”。
有關舊版 Lua 的補丁,請參閱 LuaPowerPatchesArchive。如果存在適用於多個 Lua 版本(包括當前版本)的補丁,它將顯示在此頁面上。
將正確的 Lua 發佈版本解壓縮到一個乾淨的目錄中。執行 cd
到目錄頂層並執行
patch -p1 < patchfile
diff
和 patch
。某些版本的 patch(例如
patch
手冊頁“PATCH SENDERS 的注意事項”部分中的指南 - 補丁是使用 diff
工具程式製作的。例如,假設您有一個包含原始 Lua 發佈版本的目錄 lua
,並且旁邊有一個名為 lua_new
的副本,其中包含您的補丁。使用以下序列製作補丁。請務必仔細檢查生成的補丁檔案,以防您的修補樹中有一些無關的臨時檔案。還要小心由空格差異引起的“錯誤差異”。(Emacs 使用者可以使用 whitespace-mode
來避免這些問題。)cd lua make clean cd ../lua_new make clean cd .. diff -urN lua lua_new > mychange.patch
通常,關於 Lua 內部的文檔很難找到——而且此類文檔的當前版本更為罕見 [4]。以下是有用資源列表
此補丁新增了一個新的元方法 '__eqval',當 '==' 或 '~=' 運算元的其中一個運算元恰好是表格或使用者資料時,將呼叫該方法。標準元方法 '__eq' 僅在兩個運算元都是表格或使用者資料類型時才呼叫。
目的是允許基於表格或使用者資料的高階資料類型直接與 Lua 原生類型進行比較。例如
local a = ... -- table representing a numerical value, eg mpi or bint if a == 2 then ... -- the __eqval metamethod in a's metatable will be called
將歷史記錄儲存到/從檔案恢復(LUA_HISTORY
環境變數)。
此補丁為 Lua 5.x 中現有的 readline 支援新增了以下功能
LUA_HISTORY
環境變數)。LUA_HISTSIZE
環境變數)。~/.inputrc
中使用 $if lua ... $endif
。應用補丁後啟動 Lua 並嘗試以下操作(將 ~
替換為 TAB 鍵)
~~ fu~foo() ret~fa~end<CR> io~~~s~~~o~~~w~"foo\n")<CR>
已驗證可與 Lua 5.0、5.0.2、5.1、5.2、5.3、5.4.3 配合使用。相容的 readline 函式庫包括 GNU readline 2.2.1、4.0、4.3、5.0、5.1、6.0、6.2、7.0、8.0;Mac OS X libedit 2.11;或 NetBSD libedit 2.6.5、2.6.9。請注意,儘管版本號不同,但 5.3 補丁適用於所有 5.3.x 版本。
此補丁在 /usr 以及預設的 /usr/local 下新增了預設模組路徑,並考慮了 Debian 的多架構方案,使 Lua 能夠找到作為系統一部分安裝的函式庫(例如,由您的 GNU/Linux 發佈版本安裝的函式庫)。
使用 sigaction
而不是 signal
來獲得一致的行為,例如,按下 Ctrl-C 總是退出在 I/O 上阻塞的 Lua 腳本(否則,此行為取決於系統)。
對 SvenOlsen 流行的複合賦值運算符補丁的更新,允許使用“object.counter += 2”之類的語句。除了 5.4(測試版)相容性之外,這還將移位和位運算符(<<=、>>=、&=、|= 和 ^=)新增到先前實現的 +=、-=、*= 和 /=。不包括 ++ 增量運算符,因為它暗示了匹配的 --,它已經用於註釋。(並且“+= 1”只多了兩個字元。)此外,不支援對元組進行複合賦值,因為(在我看來)它會使編寫真正令人困惑的 Lua 程式碼變得太容易,而收穫甚微。
我剛發現一個奇怪的錯誤:這在 REPL 中不起作用
> a = 1 > a += 2 3 > a 1
但它確實適用於編譯後的程式碼。:聳聳肩
此補丁為 Lua 5.4 新增了對“defer”語句的支援。“defer”語句引入了一個匿名閉包,當當前作用域退出時,無論是正常退出還是異常退出,都將執行該閉包。
範例
function test() defer print 'hello on exit' end error('error') end test()以上將列印“退出時你好”。
請注意,Lua 5.4 的一個特性是延遲的閉包可能會被多次呼叫,因此應將其編寫為冪等的。
一些用於編寫更簡潔的匿名函數的語法糖,在將參數傳遞給高階函數時非常有用。完全向後相容,並且只修改解析器,發出與函數語法相同的位元組碼。
結構 |arglist| expression
是 function(arglist) return expression end
的簡寫
此補丁為 Lua 5.3 新增了對“defer”語句的支援。“defer”語句引入了一個匿名閉包,當當前作用域退出時,無論是正常退出還是異常退出,都將執行該閉包。
範例
function test() defer print 'hello on exit' end error('error') end test()以上將列印“退出時你好”。
此補丁為重複的變數宣告新增了編譯器警告/錯誤,對於嵌套作用域中具有相同名稱的變數,這是一個警告,對於相同作用域中具有相同名稱的變數,這是一個錯誤。
範例:lua src.lua
-> src.lua:12: 警告名稱 [a] 已宣告將被遮蔽。
範例:lua src.lua
-> src.lua:12: 名稱 [b] 已在 '=' 附近宣告。
範例:lua -l json=rapidjson
以全域名稱 json
載入 rapidjson
模組。
lua-l@lists.lua.org
上的討論]
此補丁新增了移除浮點支援的選項。類似於下面的“Go Long Lua!”。
為表格提供了一個預設的迭代方法,該方法在功能上等同於 pairs
(除了不支援 __pairs
元方法)
for k, v in {1,2,3} do print(k, v) end
還為表格和使用者資料提供了一個元方法 __iter
t = {"one", "two", "three"}; setmetatable(t, {__iter = ipairs}); for k, v in t do print(k, v) end
繼續支援標準格式
for k, v in next, t, nil do print(k, v) end
通常寫成
for k, v in pairs(t) do print(k, v) end
除非只提供了一個 in
值,它必須是一個真正的函數(或閉包),而不是一個帶有 __call
元方法的表格或使用者資料。
要編譯此補丁,必須定義符號 'JH_LUA_ITER'。
這是我先前為 Lua 5.2 所做的修補程式的延伸和改進,旨在提供更簡單的語法,用於在表構造函數中指定集合(集合成員是表中的鍵,值始終為布林值 true)。此修補程式同時修改了原始程式碼和 manual.html 中的文檔。
此修補程式允許在構造函數欄位中的名稱前面加上一個可選的句點
t = {.cat = true, .dog = true} --> t = {cat = true, dog = true}
這與使用名稱鍵訪問表的語法相呼應,它適用於任何值,但其主要目的是允許
t = {.cat, .dog} --> t = {cat = true, dog = true}
與先前版本一樣,還實現了以下快捷方式
t = {[cat], [dog]} --> t = {[cat] = true, [dog] = true}
這裡的 'cat' 和 'dog' 是表達式,因此以下程式碼將創建與上面相同的集合
t = {["cat"], ["dog"]}
要編譯此修補程式,必須定義符號 'JH_LUA_SETINIT'。
當兩個運算元都是整數時,此修補程式為 '^' 運算符實現整數冪運算 (ipow)。對於非負指數,使用平方冪運算計算冪。根據「ipow 模式」處理負指數。有關更多信息,請參閱 lvm.h。
此更改將導致一些依賴 '^' 為整數提供浮點數結果的程式碼出現問題。但是,通過明確使用的數字類型(在需要浮點數的地方使用 '.0')可以輕鬆解決此問題。
提供了一個更新版本,沒有不同的模式(如果指數為負,則會出錯)。
Lua 支援表和使用者資料類型的每個物件元表,以及其他每種類型的每個類型元表。表類型元表有一些用例(使用者資料類型元表的用例較少)。例如,我們可以將表庫函數公開為表物件的方法,就像字串庫對字串所做的那樣。
此修補程式利用了一個便利的事實,即 Lua 狀態中所有類型的類型元表指標都已存在。創建表或使用者資料時,修補程式會將類型元表指標複製到新物件中。這意味著該物件會自動使用任何類型元表,直到並且除非通過以通常方式設置其元表來顯式覆蓋它。可以從 'C' 或 Lua ('getmetatable') 中通過新創建的物件訪問類型元表,並且可以在替換它的物件元表的委託方案中使用它。
我們需要一種將類型元表與物件元表區分開來設置的方法。這僅受 C API 和除錯庫支援,與現有的類型元表一致。一直困擾我的是,您必須向 'lua_setmetatable' 提供一個「虛擬」物件,才能指定類型。我添加了 API 函數 'lua_settypemt',它接受一個類型常數並設置任何類型的類型元表。與往常一樣,'lua_setmetatable' 用於設置表和使用者資料物件的物件元表。它作為設置類型元表的方法已被棄用,但對於表和使用者資料以外的類型,它仍然可以繼續使用。從除錯庫中,例如使用
debug.settypemt("table", {__add=table.insert})
定義符號 'JH_LUA_TYPEMETA' 以編譯修補程式。
或者,也可以定義符號 'JH_LUA_TABLECLASS' 以安裝表類型的類型元表,該元表以方法形式公開表庫。
此修補程式添加了二進位數字面量。由於底層程式碼的廣泛更改,其實現方式與我的 5.1 修補程式不同。這次我不支援八進位,因為它現在很少使用(儘管可以輕鬆地按照此修補程式的相同模式添加它)。我還添加了 Java/Perl 風格的嵌入式底線支援,因為它可以更容易地格式化長二進位字串(由下面的 RobHoelz 建議,儘管此修補程式僅在二進位數字面量中啟用底線)。
有效的二進位數字面量:0b1101;0B100100;0b1001_1111_0000_1010;0b11______01
底線字元僅用於提高可讀性,將被忽略。可以嵌入任意數量的底線字串,但第一個和最後一個底線之間必須至少有一個二進位數字。
要編譯此修補程式,必須定義符號 'JH_LUA_BINCONST'。
允許在 Lua 原始程式碼中使用 C 風格 (/*...*/
) 和 C++ 風格 (//...
) 的註解。可以通過 llex.h 或 luaconf.h 中的 #defines 啟用其中一種或兩種樣式。標準 Lua 註解仍然可用。
允許在表中使用特殊語法表示函數欄位,例如
tbl = {} function tbl:my_method(x, y) end
tbl = { my_method = function(self, x, y) end }
tbl = { function my_method(x, y) end }
1 月 19 日:修復了一個破壞匿名函數聲明的錯誤,例如 t = { function(args) end }
更新:根據印度尼西亞的 Sam Lie 向我發送的一個想法,我擴展了此修補程式,將 pairs
建立為表的最後迭代器。修補程式的標題已更改,以反映此擴展範圍。
此修補程式為元表添加了一個新事件 __iter
。如果元表中包含此事件,則其值必須是一個與 pairs
或 ipairs
具有相同簽名的函數。它為物件提供了一個預設迭代器,簡化了泛型 for
語句。如果沒有這樣的元方法,則使用 pairs
迭代器(僅適用於表)。
t = {[3]="three",[2]="two",[1]="one"} for k,v in t do print(k,v) end -- uses pairs setmetatable(t, {["__iter"]=ipairs}) for k,v in t do print(k,v) end -- uses ipairs for k,v in pairs(t) do print(k,v) end -- uses pairs (per standard Lua)當然,可以使用自定義函數或閉包代替
pairs
或 ipairs
。例如,對於列表,可以使用閉包來避免需要鍵變數。我提供了這個作為 Lua 5.2 中已實現的 __pairs
和 __ipairs
事件的替代方案。我仍然認為這種方法更好,並繼續將其作為修補程式提供。這兩種方法可以共存,實際上您可以為同一個物件指定所有三種元方法,因此 pairs
和 ipairs
都可以使用自定義行為,並且其中一種也可以指定為預設迭代器。
此修補程式修改了 Lua 虛擬機,以測試 TFORLOOP 位元組碼指令的第一個參數的類型。如果它是函數,則使用原始程式碼。如果它不是函數,則嘗試引用其 __iter
元方法。如果這沒有產生函數並且被迭代的物件是一個表,則嘗試引用全局 pairs
函數。如果通過這兩種方法中的任何一種獲得了函數,則調用該函數,並且其三個返回值覆蓋 TFORLOOP 的原始三個參數。然後使用原始程式碼處理由函數提供的迭代參數的泛型 for
。請注意,這在標準 Lua 處理中引入了一個微妙的變化:在第一次迭代之前而不是在迭代期間檢測到第一個參數不是函數的情況,並且它是對函數類型的測試,而不是對是否可以調用函數的測試。這將破壞一些微妙的程式碼技巧,例如使用 __call
事件來「偽造」自迭代。
要編譯此補丁,必須定義符號 'JH_LUA_ITER'。
此修補程式添加了一個用於構造類集合表的新的語法快捷方式。如果缺少欄位的值,則預設為布林值 true
,例如 {["saturday"], ["sunday"]} 構造的表與 {["saturday"] = true, ["sunday"] = true} 相同。
要編譯此修補程式,必須定義符號 'JH_LUA_SETINIT'。
增強賦值語句,以使用 in
關鍵字從表中解壓縮命名值。(請參閱 lua-l 消息「修補程式:來自 t 的局部變數 a,b」[5]。)
local a, b, c in some_table_expression
local t = some_table_expression local a, b, c = t.a, t.b, t.c
允許 C 風格複合賦值的修補程式;即,諸如「object.counter+=2」之類的語句。支援的運算符包括 +、-、..、/ 和 *。語法詳細信息在我的個人頁面上討論(請參閱:SvenOlsen)。有關解決相同問題的完全不同的(且與 5.1 相容的)方法,請參閱 [6]。
此處討論的安全導航語義的語法修補程式 [7] -- 一個索引操作 't?.v',它會抑制對未定義表訪問的錯誤。雖然人們似乎對這種类型的修補程式廣泛感興趣,但對於如何最好地處理細節,意見不一。我在下面發布了一個簡單、輕量級的版本;我的個人頁面(SvenOlsen)包含功能更強版本的程式碼和文檔。
這些按 Lua 版本排序,從最新到最舊。
如果可選的第二個參數為 true,則在退出之前調用 lua_close,以便運行終結器。Lua 解譯器在正常退出時已經調用了 lua_close,但其他嵌入 Lua 的應用程式可能沒有調用;並且您可能希望在使用 os.exit 時使用此行為(強制非零退出狀態)。
此行為無法由庫提供,只能通過修補 Lua 原始程式碼並重新構建來提供。
此修補程式使 #tbl 遵守 tbl 上的 __len 元方法,如 Lua 5.2 中所示。它還提供了一個新的全局函數 rawlen。
此修補程式增強了 Lua 5.1 抵禦雜湊 DoS 攻擊的能力。有關更多詳細信息,請參閱 HashDos。
通過使用 fwrite 而不是 fputs,使 print 列印 NUL 字元。其他人通過修補 luaconf.h 來整理它,讓用戶可以提供 luai_puts 巨集。
此修補程式自動工具化 Lua 發行版,即使用 autoconf、automake 和 libtool 構建它。適用於 Lua 5.1.5。
您必須先解壓縮檔案才能進行修補
bunzip2 lua-X.Y.Z-autotoolize-rW.patch.bz2
注意:此修補程式在多個地方錯誤地引用了版本 5.1.3,您可能需要修復它。
接下來,應用修補程式。
修補之後,您需要為某些檔案新增可執行旗標
chmod u+x autogen.sh config.guess config.sub configure depcomp install-sh missing
現在您已準備好執行 ./configure
。
此修補程式在 緊急垃圾收集器 中有描述。
修改程式碼產生器,以便 for ... in
迴圈中的迭代器可以呼叫 yield
。詳細資訊和測試程式碼可在 可讓步的 For 迴圈 中找到。
請注意,如果在 luaconf.h 中定義了 LUA_COMPAT_TFORLOOP,則修補程式的當前版本會排序操作碼,以便與編譯的 Lua 腳本保持二進位相容性。這會在虛擬機器中新增一些指令,並使修補程式變得相當複雜,否則它只有大約 25 行。
將 string.format %s 更改為將 __tostring 應用於非字串 %s 參數。
此修補程式改進了 Lua 對自訂錯誤物件的支援。變更
有關更多資訊,請參閱「Lua 中的異常模式」[3]。
這會修改相等運算符函數的行為,使它們能夠處理類型不同的值。例如,在標準 Lua 中,如果左運算元是使用者資料,而右運算元是數字,則相等性測試將會失敗。此修補程式會導致使用使用者資料的 __eq 元方法(如果有的話)。但請注意,Lua 不支援此功能的原因之一是因為 __eq、__lt 和 __le 元方法也用於 ~=、> 和 >=,方法是反轉運算元。因此,如果左右運算元都有元方法,您可能會對選擇哪個元方法感到驚訝。事實上,左元方法是首選。但當然,對於 ~=、> 和 >= 測試來說,這是正確的元方法!一個好的解決方案可能是新增 __ne、__gt 和 __ge 元方法。然後,相等運算符的行為將與算術運算符完全相同。
這個簡單的修補程式新增了八進位和二進位常數。這些常數將在原始碼文字或通過 tonumber
隱式或顯式轉換的字串內容中被識別。二進位常數的形式為 0b10101
。八進位常數的形式為 0o176
。為了與十六進位格式保持一致,也支援大寫基數說明符,但由於顯而易見的原因,不建議將其用於八進位!
要編譯此修補程式,必須定義符號「JH_LUA_BINOCTAL」。
在 x86 上對 TValue 使用 NaN 封裝以減少記憶體使用量並略微提高效能(與 LuaJIT 2 中相同)。
它與標準 Lua 程式庫完全 ABI 相容。
在一個測試腳本中,記憶體消耗從 28MB 減少到 21MB,效能提高了約 3.5-5%
修改解析器以支援使用逗號語法進行多維陣列索引,即解析器將 m[1,2] 視為與 m[1][2] 相同,從而允許以下程式碼
-- test multi-dimensional arrays with comma syntax. also test -- constructors and multiple assignment to show they're not broken. m = {[1]={}, [2]="foo"} m[1,2] = "bar" print(m[2], m[1][2], m[1,2]) --> foo bar bar m.foo = {} m.foo.bar = "baz" print(m["foo","bar"]) --> baz
虛擬機器保持不變。
目前僅適用於 GNU/Linux,如果已將除錯資訊編譯到載入 Lua C 函數的共享程式庫中,則此修補程式會將 Lua C 函數的名稱新增到回溯中。
我喜歡 Perl 的一件事是能夠使用底線來分隔大數字,所以不用這樣
local num = 1000000000000
您可以這樣做
local num = 1_000_000_000_000
通過在 luaconf.h 中取消定義 LUA_BITWISE_OPERATORS 可以禁用所有這些功能。
位元運算符首先將 lua_Number 轉換為 lua_Integer,然後將結果轉換回 lua_Number。
防止在算術和串聯中自動在字串和數字之間進行轉換。這很好,因為它可以防止錯誤;當自動轉換是一個好主意時(例如在列印函數中),仍然可以通過呼叫相關的轉換函數來完成。
當前版本並沒有嚴格地從程式庫中移除所有不需要的強制轉換;我更喜歡正確性而不是完整性。
為獨立直譯器新增了一個 -t 開關,該開關使用上述變數的預設值,從而更容易以受控的方式執行 Lua。
可變參數可以說是一種不必要的複雜化。此修補程式將其移除。
在 [Sim Ops Studios],我們通過產生一個核心支援的執行緒來嵌入 Lua,該執行緒使用 C API 呼叫 Lua 腳本。在這種配置中,腳本可能會永遠掛起,從而無法在不徹底終止執行緒的情況下乾淨地退出執行緒。此腳本提供了一種替代方案:「緊急跳出」狀態旗標,以及兩個命令(luaL_getbailout 和 luaL_setbailout)來管理該旗標。當旗標為真時,每個操作碼都被解釋為返回操作,強制 Lua 直譯器無條件地返回頂層。然後,C 程式碼可以檢查旗標的狀態,如果緊急跳出旗標為真,則乾淨地退出執行緒。使用此旗標無法編寫可以不間斷執行的腳本(儘管腳本可能會在意外的地方終止)。
此修補程式在 偵測未定義的變數 中有描述。
在解析器中新增了一個「continue」語句。虛擬機器保持不變。附帶一個小型測試套件。
可以考慮使用 luaSub 而不是修補 Lua,luaSub 包含用於相同目的的語法模組。
允許表格結構封裝一個範圍,以便表格內使用的變數具有特殊含義。請參閱 表格範圍。
允許 Lua 內建數字是以下任何一種的組合:LNUM_DOUBLE / LNUM_FLOAT / LNUM_LDOUBLE(長雙精度)LNUM_INT32 / LNUM_INT64 LNUM_COMPLEX
用途:在內部對任何 Lua 數字使用 32 位或 64 位整數精度。在非 FPU 平台上顯著(40-500%)提高 Lua 效能。對應用程式(腳本)級別以及現有的 Lua/C API 完全透明。
最新的 svn(包含測試套件)
svn export svn://slugak.dyndns.org/public/2008/LuaPatches/LNUM2
最新版本:[LuaForge LNUM 檔案]
仍然歡迎來自應用程式的真實世界測試和效能資料。該修補程式基本上已「準備就緒」;除了 LDOUBLE 模式外,沒有已知的錯誤;如果您發現任何錯誤,請分享您的經驗。
該修補程式優雅地離開了整數領域,如果結果不適合整數,則會落入浮點精度。
有關效能結果,有一個試算表和易於使用的「make-plain/float/double/ldouble/complex」目標可以在您自己的系統上運行。
print(#'a',#'\n') 97 10
請注意,這也可以通過標記過濾器來完成,但这對 ASCII 值處理(base64、模糊協議解析)很有用。我只是想要比 if c>=b2a("A") and c<=b2a("Z") 更具表現力的東西。在 Lua 中,目前沒有辦法將 ASCII 值作為常數獲取。 --lhf
此語法已經具有含義(字串長度),因為字串可以在單引號內給出。 --lhf
提供了一個新的命令列開關 (-p
),它通過 package.loaded
中的搜尋器載入具有給定套件名稱的函數,然後將該函數作為腳本執行,將命令列參數作為參數傳遞給該函數。修補程式和說明在 模組執行建議 中。
一些用於編寫更簡潔的匿名函數的語法糖,在將參數傳遞給高階函數時非常有用。完全向後相容,並且只修改解析器,發出與舊語法相同的位元組碼。有關詳細資訊,請參閱 [自述檔案]。
一些用於編寫更簡潔的匿名函數的語法糖,在將參數傳遞給高階函數時非常有用。完全向後相容,並且只修改解析器,發出與函數語法相同的位元組碼。
結構 |arglist| expression
是 function(arglist) return expression end
的簡寫
如同郵件列表中多次討論,並已在 Aranha 中實現,這裡有一個修補程式,它修改了表格建構器的語法,以便 ;
允許展開前面的列表項目。
OP_SETLIST
的參數)使用此修補程式, {foo(); bar()}
建立一個表格,其中包含 foo
的所有返回值,後面跟著 bar
的所有返回值,而 {foo(), bar()}
繼續具有與目前 Lua 相同的語義。更準確地說,如果一個列表項後面跟著一個逗號,則它會被截斷為一個返回值;否則它代表所有返回值(可能沒有)。因此, {foo(),}
會截斷,但 {foo();}
和 {foo()}
不會。
此修補程式還使欄位定義的順序精確地從左到右,這與目前 Lua 實現不同,在目前的 Lua 實現中, {[3] = "foo", 1, 2, 3}
的行為未定義。這可能會導致使用像這樣定義的非常大的表格出現效能問題
t = { "a", a = 1, "b", b = 2, "c", c = 3, -- etc }
除此之外,對效能的影響很小;有時它會快一點,有時會慢一點,但差別不大。就個人而言,我更喜歡精確的排序保證,但可以輕鬆修改修補程式以使其更接近目前的語義。有關更多詳細資訊,請與我聯繫。
實現很簡單。當遇到分號時,編譯器會發出程式碼來附加目前的表達式列表,將最後一個表達式保留為多返回值。為了做到這一點,需要將目前的表格陣列插入點保留在堆疊上,而不是將其硬編碼到虛擬機器程式碼中,因此建立新表格的操作碼被修改為使用兩個堆疊槽,將表格放在第一個槽中,並將第二個槽初始化為 1。將陣列值添加到表格的操作碼使用第二個堆疊槽作為起始索引,並將其更新為下一個起始索引。儘管這會使用一個額外的堆疊槽,但它的速度與現有程式碼大致相同。
當 luac
將多個檔案合併成單個位元組碼區塊時,生成的區塊不接受任何參數。這個小修補程式會將 ...
傳遞給合併區塊中的所有檔案
__usedindex 的行為與 __newindex 完全相同,但當索引鍵實際存在時(值被覆蓋)。這允許簡單地實現唯讀表格,鏡像 C 結構等,而無需緩慢/冗長/脆弱的表格代理建構。已知與 LuaJIT 不相容,歡迎提供修復程式。
允許如下語法:while foo do while bar do if baz then eek() break 2 end end end
如果 "foo and bar and baz" 條件成立,'break 2' 會立即跳出迴圈。該數字會計入可中斷的範圍(因此,"if"、"do" 等不計入)。
新增 C API 函數(toenum、isenum 等)用於處理無符號 32 位元位元欄位。此類列舉值具有重載的 []、() 運算,用於在 Lua 端執行位元運算。列舉值按「系列」分組,以防止在錯誤的函數中意外使用錯誤的位元遮罩。
該實現對列舉值使用負的 'tt'(Lua 類型)值,並且它們不可垃圾回收(= 應該很快)。'type()' 函數返回兩個值:"enum" 和系列名稱。缺少說明文件。
svn cat svn://slugak.dyndns.org/public/lua-bitwise/lua-5.1.1-enum-patch.diff svn cat svn://slugak.dyndns.org/public/lua-bitwise/test.lua svn cat svn://slugak.dyndns.org/public/lua-bitwise/README
此修補程式通過將 Lua 數字的類型從雙精度浮點數更改為長整數,刪除了 Lua 5.1 使用的浮點運算。它實現了除法和模數運算,以便 x == (x / y) * y + x % y。對於負指數,指數函數返回零。該修補程式刪除了 difftime 函數,並且不應使用 math 模組。string.format 函數不再處理浮點指令 %e、%E、%f、%g 和 %G。通過刪除 src/luaconf.h 中 LUA_NUMBER_INTEGRAL 的定義,可以獲得基於雙精度浮點數的 Lua 數字實現。
提供一種更有效的機制來從 Lua 訪問數值 C 變數。
為數字新增 'K' 和 'M' 後綴(例如 150K 或 12M);二進位制(K=2^10)而不是公制(K=10^3)。
在某些領域(在我們的例子中是建構過程)中使用 Lua 作為配置語言時很有用。
使 "= do ... end" 成為 "= function() ... end" 的語法糖(適用於簡單的回調)。
svn cat svn://slugak.dyndns.org/public/lua-patches/do.patch svn cat svn://slugak.dyndns.org/public/lua-patches/do.txt
可以考慮使用 luaSub 而不是修補 Lua,luaSub 包含用於相同目的的語法模組。
允許在字串中使用 \x00..\xFFFF(十六進位制)和 \u0000..\uFFFF(UTF-8 編碼)字元。
svn cat svn://slugak.dyndns.org/public/lua-patches/literals.patch svn cat svn://slugak.dyndns.org/public/lua-patches/literals.txt
此修補程式將變異運算符添加到 Lua。具體來說,現在可以通過將 "__mutate_asn" 元方法附加到 Lua 物件來使用 ":=" 運算符進行值賦值(或您希望的任何其他操作)。添加其他變異運算符(例如 += 或 <<)很簡單。
有時了解函數需要多少個參數很有用。此修補程式允許您為 debug.getinfo(或者 lua_getinfo)指定 'a',這使得函數的參數個數在名為 'arity' 的欄位中可用。