Lua 提示符

lua-users home
wiki

luaprompt 既是一个交互式 Lua 提示符,可以用来代替官方解释器,也是一个提供 Lua 命令提示符的模块,可以嵌入到宿主应用程序中。作为独立的解释器,它提供了官方 Lua 解释器中缺少的许多便利功能。作为嵌入式提示符,它适用于将 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 上的项目页面] 获取它。

替代方案

LuaRepl


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2015 年 11 月 13 日下午 8:31 GMT (差异)