mailto:john@neggie.net
Lua用户,维基幕后推手。(挑战:快速说十遍“lua-users”。)
我通过成功游说以下几点来影响Lua:
- [将表用作全局作用域](Lua 5.0)
- 词法作用域(Lua 5.0)
- 布尔类型(Lua 5.0)
- 使用标准许可证(Lua 5.0)
- 增量垃圾回收(Lua 5.1)
- 显示错误对象时遵守
__tostring(Lua 5.2) - [作用域退出钩子](Lua 5.4 待关闭变量)
演讲/出版物
我的页面(或者至少是我开始的页面)
我发布的lua-l帖子 [1]
最喜欢的lua-users wiki页面
lua-users.org是……
我认为Python的PEP [3] 是获取信息的绝佳来源。 了解Python的不足之处及其如何被修复。了解Python对最新语言潮流的实现。
我想提一下(大多数)wiki实现一个我可能没有完全意识到的绝妙特性。 它们会遗忘过去。尽管每个页面都维护着编辑历史,但随着时间的推移,它会逐渐消失。因此,删除的错误、不友善的言语和无用的材料真的会消失,除非有人明确采取行动恢复或存档它们。这与邮件列表或新闻组的概念大相径庭,在公开论坛的情况下,每一句话都可能被存档到世界末日。一篇与此主题相关的有趣文章是《论DELETE键的辩护》 [4]。
这是如何使用unix wget命令来制作此wiki的静态副本以便离线浏览。 当然,离线时您无法编辑或搜索wiki,这会失去很多乐趣。
wget --mirror --html-extension --convert-links https://lua-users.lua.ac.cn/wiki/
JOHN的Lua缺点
这些观点是严肃的,如果最终得不到解决(我很有耐心),我会考虑创建一个实现这些观点的Lua衍生版本。
- 表构造器会丢弃序列长度信息。 当一个表由表构造器定义时(例如 { x = 10; 'foo', 5, bar() }),列表部分的长度——核心在构造表时已知——会被丢弃。长度运算符(#)之后可以正确推断它,但前提是序列中没有nil值。(作为一种笨拙的解决方案,Lua 5.2中的
table.pack可以处理纯序列表。)
- 没有高效简洁的列表迭代。 "
for i=1,getn(t)"的惯用法冗长,并且粗心使用时每个项目都需要一次全局表查找。foreachi惯用法由于每个项目额外的函数调用开销而不高效,并且由于需要定义函数对象而不简洁。我实现了一个新的for构造作为解决方案,请参阅LuaPowerPatches。(截至Lua 5.1,惯用法已改变但问题依然存在。我们现在有"for i=1,#t"或"for _,item in ipairs(t)"。)
这些观点很丑陋但可容忍
- 从1开始索引和使用闭区间。 从1开始索引与大多数常用语言的习惯相反,并且被Dijkstra [5] 简洁地论证过。在Lua中,闭区间用于 "for" 构造和库函数,其中不舒服的 (n, n-1) 表示零长度。在正常代码中经常需要 +/-1 的索引调整。(参见CountingFromOne。)
- 列表操作不支持nil元素。 #运算符及其依赖的函数(如unpack和ipairs)在列表包含nil元素时是非确定性的,或者干脆忽略末尾的nil。Nil是一个有用的值,而这个基本数据类型的合理行为不应被Lua的表实现所阻碍。(Roberto承认,由于这个问题,nil不是一等公民。)如果表构造器不丢弃序列长度信息(见上文),那么解决这个限制会相当简单。
- Lua核心和标准库不枚举异常。 Lua核心和标准库可能引发的错误集合未被枚举。如果应用程序想捕获特定错误,它必须采用解析异常字符串这种脆弱的做法。
- 顺便说一句,也许更普遍地说,我页面上的“traceback改革”。例如,Lua用字符串异常连接文件路径,甚至截断这些文件路径。--DavidManura
已解决的历史遗留缺点
- 全局作用域被特殊处理。 尽管全局作用域在许多方面可以被视为一个普通表,但用户定义的事件处理方式不同。(Lua 5.0 中已修复。)例如,以下几行调用了不同的赋值事件。
a = 5
globals().a = 5
- 没有词法作用域。 与表一起使用的upvalue特性提供了一种词法作用域形式,但仅限于访问上一级作用域的情况。(Lua 5.0 中已修复。)
- 没有用户定义的迭代。 缺乏用户定义的迭代钩子阻止我们创建有用的代理表和列表。(Lua 5.0 中已修复。)
- 实现中的类型控制不佳。 实现不提供编译选项来(完全)控制C类型的使用。例如,double和long类型被广泛引用,导致某些平台出现问题。(Lua 5.0 起已大有改善。)
- 无法覆盖表或字符串的长度运算符(#)。 最显著的是表的情况,这阻碍了从Lua代码创建自定义列表状对象。(至少对于表来说,Lua 5.2 中已修复。)
-
lua_tostring 不遵守 __tostring 元表钩子。 C API中的lua_tostring和base Lua库中的tostring不相等。前者不遵守__tostring钩子,这对于用户定义类型的调试和错误输出,以及用户类型字符串的普遍模拟非常重要。作为问题的一个例子,lua命令行解释器在未捕获的异常情况下使用lua_tostring,使得无法将非字符串异常对象的细节传达给用户。(在Lua 5.2中,有一个单独的函数luaL_tolstring,它遵守__tostring,解释器的异常处理程序似乎也使用了它。)
-
string.format %s 不调用 tostring。 (Lua 5.2 中已修复。)
- 没有作用域钩子元机制。 许多应用程序将稀缺资源暴露给脚本环境,如锁;文件、内存和数据库事务的句柄;等等。这些资源需要在使用后立即且确定地释放,无论程序中发生何种异常情况。此外,Python的上下文管理器(`with`语句)为这种功能展示了无限的用途。当然,这可以使用Lua现有功能来实现,但代码会难以理解,容易出错,并且大量使用保护调用——限制了协程的潜在使用。如果Lua提供一种钩入作用域退出事件的方式,这个问题就可以解决。参见[Lua:改进确定性资源清理]。(由Lua 5.4的“待关闭”变量涵盖。)
RecentChanges · preferences
编辑 · 历史
最后编辑于 2022年9月17日 12:47 AM GMT (差异)