Lua 提示符 |
|
luaprompt 功能
luaprompt、提示模块和 luap(独立解释器)都可以通过 LuaRocks 安装,使用
luarocks install luaprompt
这将安装模块和解释器,并使用默认配置,但您也可以自定义 luaprompt 的行为。有关如何构建和使用提示模块的更多信息,请参阅 [luaprompt 的 GitHub 页面]。
作为独立的解释器,luaprompt 试图尽可能地模仿标准 Lua 解释器(目前只不支持 -E 标志),同时提供上面描述的额外功能集。下面是一些 luaprompt 会话的片段,旨在说明 luaprompt 提供的功能。
制表符自动完成的工作方式与您预期的大致相同。它试图完成表键(因此也包括全局变量)、保留关键字和文件名。在下面的示例会话中,[tab]
代表制表符键击。所有出现在 [tab]
之后的字符都是由自动完成器提供的。
> band =
[tab][tab]
_G coroutine error in math package rawset table until _VERSION debug false io module pairs repeat then while and do for ipairs next pcall require tonumber xpcall assert dofile function load nil print return tostring bit32 else getmetatable loadfile not rawequal select true break elseif goto loadstring or rawget setmetatable type collectgarbage end if local os rawlen string unpack
> band = bi
[tab]
t32
[tab]
.
[tab][tab]
bit32.arshift bit32.bnot bit32.btest bit32.extract bit32.lshift bit32.rrotate bit32.band bit32.bor bit32.bxor bit32.lrotate bit32.replace bit32.rshift
一般来说,luaprompt 会尝试尽可能地完成代码,但在完成时不会尝试猜测你的意图。在完成 bit32
表格时,它不会立即添加一个点,因为如果你想将 bit32
用作函数参数,这可能会导致困惑。因此,你需要再按一次 Tab 键。根据表格的键,luaprompt 可能会添加一个左方括号而不是一个点,或者什么都不添加。
> array = {1, 2, 3
}
> a = ar
[tab]
ray
[tab]
[
[tab]
[tab]
array[1] array[2] array[3]
> a = array[1
[tab]
]
函数值的情况类似,在完全完成函数名后,再按一次 Tab 键就会添加一个左括号。
如果 luaprompt 无法完成表格键或关键字,它会尝试使用文件名。
> loadfile("./
[tab]
ChangeLog Makefile README luap luap.c patch prompt.c prompt.h
你可以在 luaprompt 中简单地输入任何表达式来打印其值。其行为与官方解释器相同,区别在于你不需要在行首使用等号。
> 1 + 2 3 > _VERSION "Lua 5.2"
与官方解释器一样,luaprompt 会尊重值的 __tostring
元方法。
> io.stdin file (0x7f3d0aeb2240)
当打印一个值时,luaprompt 会尽力将其格式化,使其尽可能易读。为了实现这一点,它使用了一个复杂的逻辑,但以下几个例子可以说明其基本功能。(不幸的是,维基百科在格式方面并不灵活,因此很难传达 luaprompt 使用的不同字体颜色和粗细。)
数组以线性方式打印
> a = {1, 2, 3, 4, 5} > a { 1, 2, 3, 4, 5, }
当数组变得太大而无法在一行中显示时,输出将被分成多行
> for i = 1, 100 do a[i] = i end > a { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, }
具有字符串键的表格以每行一个键的方式格式化
> coroutine { yield = <function: 0x7f98dd0956e0>, status = <function: 0x7f98dd095820>, create = <function: 0x7f98dd095970>, wrap = <function: 0x7f98dd0959d0>, resume = <function: 0x7f98dd095aa0>, running = <function: 0x7f98dd095950>, }
混合表格的处理方式与预期一致。以下示例说明了 luaprompt 如何处理混合和嵌套表格(以及多行语句)。
> function recurse(n) >> if n == 1 then return "foo" else >> local a = {} >> for i = 1, n do a[i] = i end >> a.down = recurse(n - 1) >> return a >> end >> end > recurse(2) { 1, 2, down = "foo", }
当然,n = 2 的情况很简单,但 luaprompt 会尽力尽可能优雅地处理病态情况。如果表格嵌套过深,luaprompt 会在一段时间后放弃,但它会尝试尽可能多地传达有关表格结构的信息,并且会不惜一切代价避免打印格式错误的输出。
以下是 n = 30 的输出。将 n 设置为 500 也同样有效,但输出会更长。
> recurse(30) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, down = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, down = { ... }, }, }, }, }, }, }, }, }
最后,luaprompt 在打印包含自身的表格时会避免无限递归,它会打印嵌套级别而不是实际的表格内容。在下面的示例中,具有键 b
的嵌套表格有一个名为 self
的键,其
> recursive = {a = {1, 2, 3}, b = coroutine} > recursive.b.self = recursive.b > recursive.b.parent = recursive > recursive { a = { 1, 2, 3, }, b = { wrap = <function: 0x7fec9b79f9d0>, yield = <function: 0x7fec9b79f6e0>, self = { [-1]... }, parent = { [-2]... }, running = <function: 0x7fec9b79f950>, create = <function: 0x7fec9b79f970>, status = <function: 0x7fec9b79f820>, resume = <function: 0x7fec9b79faa0>, }, }
一个包含上述所有功能的大表格的很好的例子是全局表格 _G
。luaprompt 对它的处理尽可能好,但输出太长,无法在这里引用。
luaprompt 的源代码在 MIT/X11 许可下发布。你可以在 [GitHub 上的项目页面] 获取它。