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] 代表按下 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   

你可以透過輸入任何表達式來顯示其值,輸入方式就如同官方的直譯器一樣,但你不需要在程式碼行的開頭加上等號。

>  1 + 2
3
>  _VERSION 
"Lua 5.2"

如同官方的直譯器一樣,它會遵循值的 __tostring 元方法。

>  io.stdin
file (0x7f3d0aeb2240)

當一個值被顯示時,luaprompt 會盡力使用最好的格式來顯示,讓它保持在最容易閱讀的狀態。會使用一個複雜的邏輯來達成這一點,但請見以下幾個範例來說明基本的功能。(很可惜的是 wiki 在格式化方面的彈性並不佳,因此難以傳達 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 (差異)