https://www.lua.org/docs.html

Interpreter

とりあえず luajit-2.1.0-beta3 推し。

+---+    +---+    +---+    +---+
|5.1| -> |5.2| -> |5.3| -> |5.4|
+---+    +---+    +---+    +---+
  |        |        |
  |        |        +- ravi
  |        |
  |        +- moonsharp
  |
  +- luajit(5.1 base)
  |   +- moonjit
  +- luau(5.1 base)

lua-5.1 をベースに分岐したものが多い?

https://www.lua.org/versions.html

unknown: table => {"type":"table","align":[null,null,null],"children":[{"type":"tableRow","children":[{"type":"tableCell","children":[],"position":{"start":{"line":26,"column":1,"offset":399},"end":{"line":26,"column":10,"offset":408}}},{"type":"tableCell","children":[{"type":"text","value":"url","position":{"start":{"line":26,"column":12,"offset":410},"end":{"line":26,"column":15,"offset":413}}}],"position":{"start":{"line":26,"column":10,"offset":408},"end":{"line":26,"column":79,"offset":477}}},{"type":"tableCell","children":[{"type":"text","value":"memo","position":{"start":{"line":26,"column":81,"offset":479},"end":{"line":26,"column":85,"offset":483}}}],"position":{"start":{"line":26,"column":79,"offset":477},"end":{"line":26,"column":154,"offset":552}}}],"position":{"start":{"line":26,"column":1,"offset":399},"end":{"line":26,"column":154,"offset":552}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Lua5.1","position":{"start":{"line":28,"column":3,"offset":709},"end":{"line":28,"column":9,"offset":715}}}],"position":{"start":{"line":28,"column":1,"offset":707},"end":{"line":28,"column":10,"offset":716}}},{"type":"tableCell","children":[],"position":{"start":{"line":28,"column":10,"offset":716},"end":{"line":28,"column":79,"offset":785}}},{"type":"tableCell","children":[{"type":"text","value":"2012。これより古いものを使う理由は無さそう。","position":{"start":{"line":28,"column":81,"offset":787},"end":{"line":28,"column":105,"offset":811}}}],"position":{"start":{"line":28,"column":79,"offset":785},"end":{"line":28,"column":134,"offset":840}}}],"position":{"start":{"line":28,"column":1,"offset":707},"end":{"line":28,"column":134,"offset":840}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Lu15.2","position":{"start":{"line":29,"column":3,"offset":843},"end":{"line":29,"column":9,"offset":849}}}],"position":{"start":{"line":29,"column":1,"offset":841},"end":{"line":29,"column":10,"offset":850}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"https://www.lua.org/manual/5.2/readme.html#changes","children":[{"type":"text","value":"since Lua5.1","position":{"start":{"line":29,"column":13,"offset":853},"end":{"line":29,"column":25,"offset":865}}}],"position":{"start":{"line":29,"column":12,"offset":852},"end":{"line":29,"column":78,"offset":918}}}],"position":{"start":{"line":29,"column":10,"offset":850},"end":{"line":29,"column":79,"offset":919}}},{"type":"tableCell","children":[{"type":"text","value":"2015。finalizer. 関数の ","position":{"start":{"line":29,"column":81,"offset":921},"end":{"line":29,"column":101,"offset":941}}},{"type":"inlineCode","value":"_ENV","position":{"start":{"line":29,"column":101,"offset":941},"end":{"line":29,"column":107,"offset":947}}},{"type":"text","value":" 仕様変更","position":{"start":{"line":29,"column":107,"offset":947},"end":{"line":29,"column":112,"offset":952}}}],"position":{"start":{"line":29,"column":79,"offset":919},"end":{"line":29,"column":146,"offset":986}}}],"position":{"start":{"line":29,"column":1,"offset":841},"end":{"line":29,"column":146,"offset":986}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Lua5.3","position":{"start":{"line":30,"column":3,"offset":989},"end":{"line":30,"column":9,"offset":995}}}],"position":{"start":{"line":30,"column":1,"offset":987},"end":{"line":30,"column":10,"offset":996}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"https://www.lua.org/manual/5.3/readme.html#changes","children":[{"type":"text","value":"since Lua5.2","position":{"start":{"line":30,"column":13,"offset":999},"end":{"line":30,"column":25,"offset":1011}}}],"position":{"start":{"line":30,"column":12,"offset":998},"end":{"line":30,"column":78,"offset":1064}}}],"position":{"start":{"line":30,"column":10,"offset":996},"end":{"line":30,"column":79,"offset":1065}}},{"type":"tableCell","children":[{"type":"text","value":"2020。integers","position":{"start":{"line":30,"column":81,"offset":1067},"end":{"line":30,"column":94,"offset":1080}}}],"position":{"start":{"line":30,"column":79,"offset":1065},"end":{"line":30,"column":153,"offset":1139}}}],"position":{"start":{"line":30,"column":1,"offset":987},"end":{"line":30,"column":153,"offset":1139}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Lua5.4","position":{"start":{"line":31,"column":3,"offset":1142},"end":{"line":31,"column":9,"offset":1148}}}],"position":{"start":{"line":31,"column":1,"offset":1140},"end":{"line":31,"column":10,"offset":1149}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"https://www.lua.org/manual/5.4/readme.html#changes","children":[{"type":"text","value":"since Lua5.3","position":{"start":{"line":31,"column":13,"offset":1152},"end":{"line":31,"column":25,"offset":1164}}}],"position":{"start":{"line":31,"column":12,"offset":1151},"end":{"line":31,"column":78,"offset":1217}}}],"position":{"start":{"line":31,"column":10,"offset":1149},"end":{"line":31,"column":79,"offset":1218}}},{"type":"tableCell","children":[{"type":"text","value":"2021。const, to-be-closed","position":{"start":{"line":31,"column":81,"offset":1220},"end":{"line":31,"column":105,"offset":1244}}}],"position":{"start":{"line":31,"column":79,"offset":1218},"end":{"line":31,"column":153,"offset":1292}}}],"position":{"start":{"line":31,"column":1,"offset":1140},"end":{"line":31,"column":153,"offset":1292}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"LuaJIT","position":{"start":{"line":32,"column":3,"offset":1295},"end":{"line":32,"column":9,"offset":1301}}}],"position":{"start":{"line":32,"column":1,"offset":1293},"end":{"line":32,"column":10,"offset":1302}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"https://luajit.org/","children":[{"type":"text","value":"https://luajit.org/","position":{"start":{"line":32,"column":12,"offset":1304},"end":{"line":32,"column":31,"offset":1323}}}],"position":{"start":{"line":32,"column":12,"offset":1304},"end":{"line":32,"column":31,"offset":1323}}}],"position":{"start":{"line":32,"column":10,"offset":1302},"end":{"line":32,"column":77,"offset":1369}}},{"type":"tableCell","children":[{"type":"text","value":"Lua5.1base。最終版は ","position":{"start":{"line":32,"column":79,"offset":1371},"end":{"line":32,"column":95,"offset":1387}}},{"type":"inlineCode","value":"2.1.0-beta3","position":{"start":{"line":32,"column":95,"offset":1387},"end":{"line":32,"column":108,"offset":1400}}},{"type":"text","value":"。neovimもこれ。","position":{"start":{"line":32,"column":108,"offset":1400},"end":{"line":32,"column":119,"offset":1411}}},{"type":"inlineCode","value":"FFI","position":{"start":{"line":32,"column":119,"offset":1411},"end":{"line":32,"column":124,"offset":1416}}},{"type":"text","value":" も強力。","position":{"start":{"line":32,"column":124,"offset":1416},"end":{"line":32,"column":129,"offset":1421}}}],"position":{"start":{"line":32,"column":77,"offset":1369},"end":{"line":32,"column":138,"offset":1430}}}],"position":{"start":{"line":32,"column":1,"offset":1293},"end":{"line":32,"column":138,"offset":1430}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Luau","position":{"start":{"line":33,"column":3,"offset":1433},"end":{"line":33,"column":7,"offset":1437}}}],"position":{"start":{"line":33,"column":1,"offset":1431},"end":{"line":33,"column":10,"offset":1440}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"https://luau-lang.org/","children":[{"type":"text","value":"https://luau-lang.org/","position":{"start":{"line":33,"column":12,"offset":1442},"end":{"line":33,"column":34,"offset":1464}}}],"position":{"start":{"line":33,"column":12,"offset":1442},"end":{"line":33,"column":34,"offset":1464}}}],"position":{"start":{"line":33,"column":10,"offset":1440},"end":{"line":33,"column":77,"offset":1507}}},{"type":"tableCell","children":[{"type":"text","value":"Lua5.1 の superset。Roblox専用。オープンソースではない。","position":{"start":{"line":33,"column":79,"offset":1509},"end":{"line":33,"column":118,"offset":1548}}}],"position":{"start":{"line":33,"column":77,"offset":1507},"end":{"line":33,"column":135,"offset":1565}}}],"position":{"start":{"line":33,"column":1,"offset":1431},"end":{"line":33,"column":135,"offset":1565}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Ravi","position":{"start":{"line":34,"column":3,"offset":1568},"end":{"line":34,"column":7,"offset":1572}}}],"position":{"start":{"line":34,"column":1,"offset":1566},"end":{"line":34,"column":10,"offset":1575}}},{"type":"tableCell","children":[{"type":"link","title":null,"url":"http://ravilang.github.io/","children":[{"type":"text","value":"http://ravilang.github.io/","position":{"start":{"line":34,"column":12,"offset":1577},"end":{"line":34,"column":38,"offset":1603}}}],"position":{"start":{"line":34,"column":12,"offset":1577},"end":{"line":34,"column":38,"offset":1603}}}],"position":{"start":{"line":34,"column":10,"offset":1575},"end":{"line":34,"column":77,"offset":1642}}},{"type":"tableCell","children":[{"type":"text","value":"Lua5.3base?。limited optional static typing and MIR based JIT compiler","position":{"start":{"line":34,"column":79,"offset":1644},"end":{"line":34,"column":148,"offset":1713}}}],"position":{"start":{"line":34,"column":77,"offset":1642},"end":{"line":34,"column":150,"offset":1715}}}],"position":{"start":{"line":34,"column":1,"offset":1566},"end":{"line":34,"column":150,"offset":1715}}}],"position":{"start":{"line":26,"column":1,"offset":399},"end":{"line":34,"column":150,"offset":1715}}}

変わり種

headeronly. include するだけで使える。

LUA に更に埋め込む

Translator

MoonScript

TypescriptToLua

  • 後で出てくる、local-lua-debugger はこれで実装されているぽい。

LuneScript/

Teal

Language server

EmmyLua

  • Java製

  • EmmyLua Annotation に対応。これにより、組み込み型のインテリセンスを動作させることができて使い勝手が向上する

lua-language-server

  • EmmyLua Annotation に対応。これにより、組み込み型のインテリセンスを動作させることができて使い勝手が向上する

設定例

    "Lua.runtime.version": "LuaJIT",
    "Lua.workspace.preloadFileSize": 10000,
    "Lua.runtime.path": [
        "?.lua",
        "?/init.lua",
        "?/?.lua",
    ],

lua-lsp

Debug adapter

local-lua-debugger-vscode

  • Debugされるスクリプト側に仕込み不要

  • ⭐ luajit 対応

  • __tostring でエラーが発生すると固まるので、__tostring の実装で例外が起きないように注意

  • 起動時の引数に \\ が含まれているとエラーになる => 0.2.2 で修正

lua-debug

  • Debugされるスクリプト側に仕込み不要

  • hook が拡張してある。途中で止めたりとかできるぽい

  • 残念ながら luajit では動作しない

Formatter

stylua

  • ⭐ rust 製でインストールしやすい

stylua.toml

column_width = 120
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 4
quote_style = "AutoPreferDouble"
no_call_parentheses = true

ソース読み

https://ousttrue.github.io/lua/