Lua 增强补丁存档

lua-users home
wiki

此页面包含针对旧版 Lua 的 LuaPowerPatches

Lua 5.0

位运算符和十六进制支持

此补丁为 Lua 5.0 添加了以下功能

注意:此补丁向 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',在 whilefor 语句后使用 '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 中添加块注释:--[[...]]。使用长字符串解析器 ([[...]]),因此块注释可以嵌套。推荐用法
--[[---------
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操作码的调用)正确地成为非递归的。

(以前是“休眠补丁”;“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 }) 前面仍然需要逗号。

局部函数

用于 local 语句的新语法糖
local foo(...) ... end
与相同
local foo foo=function(...) ... end
注意,foo 在函数内部是可见的。在 Lua 4.0 中,这并没有太大帮助(事实上,当访问 %foo 时会引发错误)。

我不习惯 Lua 4.1 的代码生成器,所以这个补丁的(更有用)版本需要等待一段时间。

lua_getcclosure()

向 API 添加了缺少的函数,该函数检索 C 函数的闭包值。(参见 John Belmonte 在 2000-10-7 发送的 lua-l 消息“pushcclosure / tocfunction issue”。)

嵌套函数名

更改解析器以允许定义函数名嵌套在多个级别的表中。(参见 John Belmonte 在 2001-02-02 发送的 lua-l 消息“Re: Son of Lua - Sol”。)

语法变为:NAME {'.' NAME} [':' NAME]

弱引用

向 Lua 添加弱引用。参见 https://www.lua.ac.cn/notes/ltn006.html

列表迭代 for 结构

添加了另一种形式的 for 结构,它迭代列表。语义上等效于标准库函数 foreachi(参见 John Belmonte 在 2001-04-26 发送的 lua-l 消息“list iteration for statement”。)

lua_dolines 补丁

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 (差异)