7 Lua スタンドアローン
Lua はホストの C プログラムに埋め込んで使う拡張言語として設計されていますが、スタンドアローンの言語として使われることもよくあります。スタンドアローン言語 Lua のインタープリタは lua という名前であり、標準ディストリビューションに含まれます。このスタンドアローンインタープリタには全ての標準ライブラリが含まれます。使い方は次の通りです:
lua [options] [script [args]]
オプションを示します:
-e stat: 文字列statを実行します。-i:scriptを実行してから対話モードに入ります。-l mod:modを require し、返り値をグローバル変数modに代入します。-v: バージョン情報を出力します。-E: 環境変数を無視します。-W: 警告を有効にします。--: オプションの処理を止めます。-:stdinをファイルとして実行し、オプションの処理を止めます。
オプションの処理が終わると、lua は与えられた script を実行します。引数を与えずに lua を呼び出すと、標準入力 (stdin) がターミナルなら lua -v -i が実行され、それ以外の場合は lua - が実行されます。
オプション -E がないとき、インタープリタは引数を実行する前に LUA_INIT_5_4 を確認します (LUA_INIT_5_4 が定義されていないときはバージョンの付いていない LUA_INIT も確認します)。この変数の値が @filename という形をしているなら filename が実行され、そうでないときは文字列そのものが実行されます。
オプション -E があるとき Lua は環境変数を一切使いません。特に package.path と package.cpath は luaconf.h で定義されるデフォルトのパスに設定されます。
オプション -e, -l, -W はコマンドにある順番で処理されます。例えば lua を
$ lua -e 'a=1' -llib1 script.lua
と起動すると、まず a に 1 が代入され、それからライブラリ lib1 が require され、最後にファイル script.lua が引数無しに実行されます (ここで $ はシェルのプロンプトであり、シェルによって異なります)。
lua はコードの実行を開始する前にコマンドライン引数を全て収集し、グローバルなテーブル arg に格納します。スクリプトの名前がインデックス 0、スクリプトの名前の後にある最初の引数がインデックス 1 となり、以下同様です。スクリプト名の前にある引数 (インタープリタの名前とその引数) は負のインデックスを持ちます。例えば lua を
$ lua -la b.lua t1 t2
と呼び出すと、arg テーブルは次のように設定されます:
arg = { [-2] = "lua", [-1] = "-la",
[0] = "b.lua",
[1] = "t1", [2] = "t2" }
lua の呼び出しにスクリプトが含まれなければ、インタープリタの名前がインデックス 0 に入り、その他の引数がその後に続きます。例えば lua を
$ lua -e "print(arg[1])"
と起動すると -e が出力されます。呼び出しにスクリプトがあれば、そのスクリプトが arg[1], ..., arg[#arg] を引数として呼ばれます。Lua における他のチャンクと同じように、スクリプトは可変長引数関数としてコンパイルされます。
対話モードの Lua はユーザーからの行入力を待ちます。行を読み込むと、まず Lua はそれを式として解釈します。これが成功すれば、その値を出力します。失敗すれば、次は行を文として解釈します。不完全な文を入力した場合には、インタープリタはもう一度プロンプトを出して文の完成を待ちます。
グローバル変数 _PROMPT が文字列を持つなら、その値がプロンプトとして使われます。同様にグローバル変数 _PROMPT2 が文字列を持つなら、その値が二段階目のプロンプト (不完全な文を読み込んだときに起動されるプロンプト) として使われます。
スクリプトで保護されていないエラーが起こった場合には、インタープリタはエラーを標準エラー出力に報告します。エラーオブジェクトが __tostring メタメソッドを持った文字列でないオブジェクトである場合には、インタープリタは __tostring を呼んでユーザーに示す最終的なメッセージを生成します。そうでない場合インタープリタはエラーオブジェクトを文字列に変換し、それにスタックトレースバックを付けます。警告が有効なときは、警告は標準エラー出力にそのまま表示されます。
インタープリタが通常終了するとき、メイン Lua ステートはクローズ (lua_close) されます。スクリプトで os.exit を呼んで終了すればこのステップを飛ばせます。
Unix システムで Lua を スクリプトインタープリタとして使えるように、Lua はファイルチャンクの一行目が # で始まる場合それを無視します。これにより #! で始まるファイルに chmod +x することで Lua スクリプトを実行可能なプログラムにできます。例えば最初の行を次のようにします:
#!/usr/local/bin/lua
もちろん Lua インタープリタの場所はマシンによって異なるので、lua が PATH にあることが分かっている場合には最初の行を
#!/usr/bin/env lua
とした方がよりポータブルになります。