Lua Power Patches 檔案館

lua-users home
wiki

此頁面包含 LuaPowerPatches,適用於舊版的 Lua。

Lua 5.0

位元運算子與十六進位支援

此修補程式新增下列功能至 Lua 5.0

注意:此修補程式新增了 Lua 虛擬機的 opcode。這會造成兩個主要的後果:(1) 結果無法稱為「Lua」,(2) 已編譯程式碼無法在不包含此修補程式的直譯器中執行。

套用此修補程式後,請嘗試執行下列程式碼:

> hex=function(n) print("0x"..string.format("%X",n)) end
> hex(0x54&0x55)
0x54
> hex(0x54|0x66)
0x76
> hex(0x54#0x66)
0x32
> hex(#0x45)    
0xFFFFFFBA
> print("Hel\x6c\x6f world\x21")
Hello world!
> 

回報的錯誤/注意:此修補程式使用 C 語言函式 strtol(),在大部分系統上,此函式的最大輸入值為 0x7FFFFFFF,因此命令 hex(0x97F2DA31) 會輸出 0x7FFFFFFF。[在支援 64 位元整數的電腦上,使用 strtoll()(Posix)或 __strtoi64()(Win32),可以很輕易地修復這個問題。]

已改善的協同程序

此修補程式在沒有引入作業系統相依性或依賴作業系統提供的功能(例如執行緒函式庫或 C 堆疊配置)的情況下,儘可能移除對自元方法或 C 語言函式產生的協同程序進行讓步的限制。請參閱 ImprovedCoroutinesPatch

__usedindex 元表修補程式

__newindex 會捕捉對新表索引項目的建立/配置,但不會捕捉對既有索引項目的建立/配置。如果舊值具有指向其父項目的後向參照呢?(__gc 不夠。)如果變更後的值應該反映在 C 資料結構中呢?

__usedindex 的作用就像 __newindex,但 table[key] 會存在。

範例

function used(t,k,v)
   local o
   o = rawget(t,k)
   print("__usedindex",t,k,v,o)
   rawset(t,k,v)
end
function new(t,k,v)
   print("__newindex",t,k,v)
   rawset(t,k,v)
end

讓多餘的「do」和「then」代辦項目可選

Lua 要求 if 陳述句後接「then」,而 whilefor 陳述句後接「do」。此修補程式讓這些代辦項目可選。

Lua 4.x

Unix/Win32 Makefile

修改 lua-4.1-work4 Makefiles,使其便於使用 GNU Make 透過編輯 lua/config,在 Windows 32 位元系統中使用 MSVC 建置 Lua 程式庫和可執行檔。不會影響 Unix 相容性。主要的困難在於 Windows 使用不同的副檔名和幾項稍微不同的壓縮器/連結器/編譯器選項。藉由使用巨集表示副檔名,組態檔案可以在不編輯實際 Makefiles 的情況下,針對 Unix 或 Windows 32 位元系統進行組態。

區塊註解

於 Lua 中新增區塊註解:--[[...]]。使用長字串剖析器 ([[...]]) ,因此可以巢狀區塊註解。建議用法
--[[---------
Comment...
--]]---------
其特性是,只要於第一個 [ 前面插入一個空白(或於 --[[ 前面新增一個 -),就能將區塊註解停用

Lua autoconf 補丁

於 Lua 發行版(4.1work4)執行自動組態。 

Lua setconstant 補丁

新增 Lua 函式 setconstant( table ),它會將字串或數字的表格標記為常數,如此一來,此表格的內容將永遠不會被記憶體回收機制回收。請注意,此表格可以巢狀,而且任何非數字或字串的內容都不適合使用此函式。

yield()

變更 Lua VM,讓從 Lua 至 Lua 函式的呼叫變為「沒有堆疊」;亦即不會在 C 堆疊中儲存執行狀態。於 Lua 基本程式庫中新增 yield() 函式,可用於實作潛在函式/協同多工。當指令碼呼叫 yield() 時,主程式中的 lua_dostring/lua_dofile/lua_dobuffer 函式呼叫會以 LUA_YIELD 程式碼傳回。指令碼的執行狀態會保留在 lua_State 結構中,而且可以使用新的 API 函式 lua_resume(L) 於稍後時間繼續執行指令碼。

此補丁也會產生額外的效益,那就是讓 Lua 的尾呼叫(使用 OP_TAILCALL opcode 者)正確地不具遞迴性。

(曾是「sleep patch」;「yield」被視為此功能的較佳名稱,所以我就改名了。 - ThatcherUlrich

已增強的表格建構器

表格建構器的記錄部分(field=value)已修改,因此允許 function 陳述式,而且逗點現在為選用。因此以下程式碼區塊有效
x = { 
  function foo() end
  function bar() end
  c=1
  d=2
} 
且等於
x = { 
  foo=function() end,
  bar=function() end,
  c=1,
  d=2,
} 

[val]=val 紀錄和清單初始化項(({ expr, expr }))前仍需要逗點。

區域變數

local 語句的新語法糖
local foo(...) ... end
等同於
local foo foo=function(...) ... end
請注意,foo 在函式中可見。在 Lua 4.0 中,並無太多幫助(事實上,在存取 %foo 時會傳回錯誤)。

我不習慣 Lua 4.1 的程式碼產生器,因此稍候會提供此 patch 的(更實用的)版本。

lua_getcclosure()

新增遺失函式至 API,用於擷取 C 函式的封閉值。(請參閱 John Belmonte 在 2000 年 10 月 7 日發布的 lua-l 訊息「pushcclosure / tocfunction issue」。)

巢狀函式名稱

修改 parser,允許在多於一層的表格中定義函式名稱。(請參閱 John Belmonte 在 2001 年 2 月 2 日發布的 lua-l 訊息「Re: Son of Lua - Sol」。)

語法為:NAME {'.' NAME} [':' NAME]

弱參照

將弱參照加入 Lua。請參閱 https://lua.dev.org.tw/notes/ltn006.html

清單反覆運算建構

新增另一種 for 建構,用於反覆運算清單。語義上等同於標準函式庫函式 foreachi(請參閱 John Belmonte 在 2001 年 4 月 26 日發布的 lua-l 訊息「list iteration for statement」。)

lua_dolines patch

Lua-4.0.1 的修補程式。加入

lua_dolines(lua_State *L, char *fname, FILE *f, int *lineno)

到 Lua API 中,這個函式可以執行 Lua 程式碼,從已開啟的檔案,直到遇到「$」為止。

lua_gc_long 修補程式

Lua-4.0.1 的修補程式。

此修補程式會變更縮放整數與長整數的比較方式。這其實是一個錯誤修正,否則,在典型的 64 位元電腦上,lua_setgcthreshold(L,0) 會無法運作。


近期更新 · 偏好設定
編輯 · 歷史記錄
最後編輯時間 2012 年 1 月 4 日下午 2:36 GMT (diff)