7 – Luaスタンドアロン

LuaはホストCプログラムへ組み込む拡張言語として設計されていますが、スタンドアロン言語としても頻繁に使われます。単にluaと呼ばれる、スタンドアロン言語としてのLuaインタープリターが標準配布物に含まれています。スタンドアロンインタープリターはすべての標準ライブラリを含みます。使用法は次のとおりです。

     lua [options] [script [args]]

オプションは次のとおりです。

  • -e stat:文字列statを実行します。
  • -iscriptの実行後に対話モードへ入ります。
  • -l modmodを「require」し、その結果をグローバルmodへ代入します。
  • -l g=modmodを「require」し、その結果をグローバルgへ代入します。
  • -v:バージョン情報を表示します。
  • -E:環境変数を無視します。
  • -W:警告を有効にします。
  • --:オプションの処理を停止します。
  • -stdinをファイルとして実行し、オプションの処理を停止します。 オプションを処理した後、luaは指定されたscriptを実行します。luaを引数なしで呼び出すと、標準入力(stdin)が端末ならlua -v -iとして、それ以外ならlua -として動作します。

オプション-Eなしで呼び出すと、インタープリターはすべての引数を実行する前に環境変数LUA_INIT_5_5(バージョン付きの名前が定義されていなければLUA_INIT)を調べます。変数の内容が@filenameの形式なら、luaはそのファイルを実行します。それ以外の場合、luaは文字列自体を実行します。

オプション-Eを指定して呼び出すと、Luaはどの環境変数も参照しません。特に、package.pathpackage.cpathの値はluaconf.hで定義されたデフォルトパスに設定されます。このオプションが有効であることをライブラリへ通知するため、スタンドアロンインタープリターはレジストリのフィールド"LUA_NOENV"を真の値に設定します。ほかのライブラリも同じ目的でこのフィールドを参照できます。

オプション-e-l-Wは出現順に処理されます。たとえば、次のような呼び出しは

     $ lua -e 'a=1' -llib1 script.lua

まずaを1に設定し、次にライブラリlib1をrequireし、最後にファイルscript.luaを引数なしで実行します。(ここで$はシェルプロンプトです。実際のプロンプトは異なる場合があります。)

コードを実行する前に、luaはすべてのコマンドライン引数をargという名前のグローバルテーブルへ集めます。スクリプト名はインデックス0、スクリプト名の後の最初の引数はインデックス1となり、以降も同様です。スクリプト名より前の引数(つまり、インタープリター名とそのオプション)は負のインデックスに入ります。たとえば、次の呼び出しでは

     $ lua -la b.lua t1 t2

テーブルは次のようになります。

     arg = { [-2] = "lua", [-1] = "-la",
             [0] = "b.lua",
             [1] = "t1", [2] = "t2" }

呼び出しにスクリプトがなければ、インタープリター名がインデックス0に入り、その後にほかの引数が続きます。たとえば、次の呼び出しは

     $ lua -e "print(arg[1])"

-e”を表示します。スクリプトがある場合、スクリプトは引数arg[1]、···、arg[#arg]で呼び出されます。Luaのすべてのチャンクと同様、スクリプトは可変長引数関数としてコンパイルされます。

対話モードでは、Luaはプロンプトを繰り返し表示して行を待ちます。行を読み取ると、Luaは最初にその行を式として解釈しようとします。成功すれば値を表示します。それ以外の場合は行をチャンクとして解釈します。不完全なチャンクを入力すると、インタープリターは別のプロンプトを表示して、チャンクの完成を待ちます。

完全な各行は新しいチャンクとして読み取られるため、ローカル変数は行を越えて存続しないことに注意してください。混乱を避けるため、行が予約語localで始まると、インタープリターは警告を表示します。

     > x = 20      -- global 'x'
     > local x = 10; print(x)
         --> warning: locals do not survive across lines in interactive mode
         --> 10
     > print(x)     -- back to global 'x'
         --> 20
     > do       -- incomplete chunk
     >> local x = 10; print(x)    -- '>>' prompts for line completion
     >> print(x)
     >> end     -- chunk completed
        --> 10
        --> 10

グローバル変数_PROMPTが文字列を含む場合、その値がプロンプトとして使われます。同様に、グローバル変数_PROMPT2が文字列を含む場合、その値が副プロンプト(不完全な文の途中で表示)として使われます。

スクリプト内で保護されていないエラーが発生すると、インタープリターは標準エラー出力へエラーを報告します。エラーオブジェクトが文字列ではないもののメタメソッド__tostringを持つ場合、インタープリターはこのメタメソッドを呼び出して最終メッセージを生成します。それ以外の場合、エラーオブジェクトを文字列へ変換し、スタックトレースバックを追加します。警告が有効な場合、警告は標準エラー出力へそのまま表示されます。

正常終了時、インタープリターはメインのLuaステートを閉じます(lua_closeを参照)。スクリプトはos.exitを呼び出して終了することで、この手順を回避できます。

UnixシステムでLuaをスクリプトインタープリターとして使えるよう、Luaはファイルチャンクの先頭行が#で始まる場合、その行を読み飛ばします。そのため、chmod +x#!形式を使い、Luaスクリプトを次のような実行可能プログラムにできます。

     #!/usr/local/bin/lua

もちろん、Luaインタープリターの場所は使用するマシンによって異なる場合があります。luaPATHにあるなら、次の方が移植性の高い解決策です。

     #!/usr/bin/env lua