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
とした方がよりポータブルになります。