此页面包含针对旧版 Lua 的 LuaPowerPatches。
Lua 5.0
位运算符和十六进制支持
此补丁为 Lua 5.0 添加了以下功能
- 在数字字面量中支持十六进制 0xXXX。
- 在字符串中支持十六进制 '\xXX' 字符。
- 用于 AND (&)、OR (|) 和 XOR (#) 的中缀位运算符。
- 使用单独的 # 进行一元位取反。
注意:此补丁向 Lua 虚拟机添加了操作码。这有两个主要后果:(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 位整数(即 long long)的机器上很容易修复,方法是使用 strtoll()(Posix)或 __strtoi64()(Win32)]。
改进的协程
此补丁在最大程度上消除了在元方法或 C 函数中从协程中 yield 的限制,而不会引入操作系统依赖性或依赖于操作系统设施(如线程库或 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',在 while
和 for
语句后使用 'do'。此补丁使它们可选。
Lua 4.x
Unix/Win32 Makefile
更改 lua-4.1-work4 Makefile,以便使用 GNU Make 在 Win32 下使用 MSVC 轻松构建 Lua 库和可执行文件,方法是编辑 lua/config。不会影响 Unix 兼容性。主要困难在于 Windows 使用不同的文件扩展名以及一些略微不同的归档器/链接器/编译器选项。通过使用宏来代表文件扩展名,配置文件可以配置为 Unix 或 Win32,而无需编辑实际的 Makefile。
- Lua 版本: lua-4.1-work4
- 向后兼容: 是,此补丁保留了所有现有的 Lua 配置默认值,并且应该在 Unix 下与标准发行版一样构建。
- 更改/添加/删除的行 ?
- Lua 作者立场: 未知
- 作者: ThatcherUlrich
- 最后更新: 2002-Feb-18 (初始版本)
- 待办事项: 更多测试,以及在 Windows 下实现 DLL 的构建。
- [下载]
块注释
在 Lua 中添加块注释:--[[...]]
。使用长字符串解析器 ([[...]]
),因此块注释可以嵌套。推荐用法
--[[---------
Comment...
--]]---------
它具有一个很好的特性,即可以通过在第一个 [
之前插入一个空格 (或在 --[[
之前添加一个 -
) 来禁用块注释。
- 向后兼容: 否,但不太可能破坏现有程序。
- 更改/添加/删除的行 4/10/0
- Lua 作者立场: 正在考虑将其用于 Lua 4.1。
- 作者: Edgar Toernig
- 最后更新: 2001-Dec-14
- [4.0 版本] [4.1 版本]
Lua autoconf 补丁
自动配置 Lua 发行版 (4.1work4)。
- 向后兼容性:是
- 更改/添加/删除的行数:未知
- Lua 作者的立场:- 不太可能添加到发行版中
- 作者:未知
- 最后更新:未知
- [1]
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
操作码的调用)正确地成为非递归的。
- 向后兼容:是,前提是与“yield()”没有名称冲突。
- 更改/添加/删除的行 ~400
- Lua 作者的立场:Lua 5.0 中提供了一个改进的实现。
- 作者:Thatcher Ulrich
- 最后更新:2002-Jan-16 (修复了一些错误 -ThatcherUlrich)
- 待办事项:在错误处理方面仍然存在一些错误。例如,从交互式 lua 会话中,如果您
'dofile("program.lua")'
,而program.lua
执行了yield()
,Lua 可能会崩溃。如果可能,建议使用 5.0 中支持的实现。
- [下载]
(以前是“休眠补丁”;“yield”被认为是此功能的更好名称,因此我更改了名称。 -ThatcherUlrich)
增强的表格构造函数
表格构造函数的记录部分(field=value
)被修改,以便现在允许函数语句,并且逗号是可选的。因此这变得有效
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 })
前面仍然需要逗号。
- 向后兼容性:是
- 更改/添加/删除的行 4/8/0
- Lua 作者的立场: 不知道
- 作者: Edgar Toernig
- 最后更新: 2001-12-16
- [4.0 版本]
局部函数
用于 local 语句的新语法糖
local foo(...) ... end
与相同
local foo foo=function(...) ... end
注意,foo
在函数内部是可见的。在 Lua 4.0 中,这并没有太大帮助(事实上,当访问 %foo
时会引发错误)。
- 向后兼容性:是
- 更改/添加/删除的行 2/6/0
- Lua 作者的立场: 不知道
- 作者: Edgar Toernig
- 最后更新: 2001-12-16
- [4.0 版本]
- 我不习惯 Lua 4.1 的代码生成器,所以这个补丁的(更有用)版本需要等待一段时间。
lua_getcclosure()
向 API 添加了缺少的函数,该函数检索 C 函数的闭包值。(参见 John Belmonte 在 2000-10-7 发送的 lua-l 消息“pushcclosure / tocfunction issue”。)
- 向后兼容性:是
- 更改/添加/删除的行 0/19/0
- Lua 作者的立场: 正在考虑将其纳入 Lua 4.1。(参见 Roberto Ierusalimschy 在 2000-10-11 发送的 lua-l 消息“Re: pushcclosure / tocfunction issue”。)
- 作者: John Belmonte
- 最后更新: 2001-02-03
- [下载]
嵌套函数名
更改解析器以允许定义函数名嵌套在多个级别的表中。(参见 John Belmonte 在 2001-02-02 发送的 lua-l 消息“Re: Son of Lua - Sol”。)
语法变为:NAME {'.' NAME} [':' NAME]
- 向后兼容性:是
- 更改/添加/删除的行 2/0/0
- Lua 作者的立场: 将包含在 Lua 4.1 中。(参见 Roberto Ierusalimschy 在 2001-02-19 发送的 lua-l 消息“Re: index tag method”。)
- 作者: John Belmonte
- 最后更新: 2001-02-03
- [下载]
弱引用
向 Lua 添加弱引用。参见 https://lua.ac.cn/notes/ltn006.html。
- 向后兼容性:是
- 更改/添加/删除的行 0/77/0
- Lua 作者的立场: 将向 Lua 4.1 添加弱表。(参见 Luiz Henrique de Figueiredo 在 2001-04-20 发送的 lua-l 消息“Re: Coroutine support in 4.1 / IPC mechanisms”。)
- 作者: John Belmonte
- 最后更新: 2001-02-28
- [下载]
列表迭代 for 结构
添加了另一种形式的 for
结构,它迭代列表。语义上等效于标准库函数 foreachi
(参见 John Belmonte 在 2001-04-26 发送的 lua-l 消息“list iteration for statement”。)
- 向后兼容性:是
- 更改/添加/删除的行 5/88/0
- Lua 作者的立场 -
- 作者: John Belmonte
- 最后更新: 2001-06-09
- [下载]
lua_dolines 补丁
Lua-4.0.1 的补丁。添加
lua_dolines(lua_State *L, char *fname, FILE *f, int *lineno)
到 Lua API 中,它从已打开的文件中执行 Lua 代码,直到遇到 '$'。
- 向后兼容性:是
- 更改/添加/删除的行 79
- Lua 作者的立场: 将在 5.0 中被 lua_load 弃用(参见 Luiz Henrique de Figueiredo 在 2002-07-29 发送的 lua-l 消息“Re: [ANNOUNCE] lua_dolines-1.1.patch”。)
- 作者: JuergenFuhrmann)
- 最后更新: 2002-Jul-29
- [下载][README]
lua_gc_long 补丁
适用于 Lua-4.0.1 的补丁。
此补丁更改了缩放整数与长整数比较的方式。实际上这是一个错误修复,因为否则,在典型的 64 位机器上,lua_setgcthreshold(L,0) 无法正常工作。
- 向后兼容性:是
- 更改/添加/删除的行 2
- Lua 作者的立场: 已经知道,在 5.0b 中修复(参见 Roberto Ierusalimschy 在 2003-Feb-20 的 lua-l 消息“Re: gc confusion: now resolved”)
- 作者: JuergenFuhrmann)
- 最后更新: 2003-Feb-21
- [下载][README]
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2012 年 1 月 4 日下午 2:36 GMT (差异)