この初版はLua 5.0向けに書かれています。後続のバージョンでも大部分は関連性がありますが、いくつかの違いがあります。
第4版はLua 5.3に対応しており、Amazonおよびその他の書店で入手できます。
本書を購入することで、Luaプロジェクトの支援にもなります。


1.1 – チャンク

Luaが実行するコードの各部分(ファイルや対話モードでの単一行など)は、チャンクです。より具体的には、チャンクは単なる一連の文です。

セミコロンは任意の文の後に付けることができます。通常、私はセミコロンを同一行に記述された2つ以上の文を区切る場合にのみ使用しますが、これは単なる慣習です。改行はLuaの構文において役割を果たしません。例えば、次の4つのチャンクはすべて有効で同等です。

    a = 1
    b = a*2
    
    a = 1;
    b = a*2;
    
    a = 1 ; b = a*2
    
    a = 1   b = a*2    -- ugly, but valid

チャンクは「Hello world」の例のように単一の文ほど単純なものでも、階乗の例のように文と関数定義(後で見るように、実際には代入です)の混合で構成されるものでもかまいません。チャンクは任意の大きさにすることができます。Luaはデータ記述言語としても使用されるため、数メガバイトのチャンクも珍しくありません。Luaインタプリタは、大きなサイズでも全く問題ありません。

プログラムをファイルに書き込む代わりに、スタンドアロンインタプリタを対話モードで実行できます。引数なしでLuaを呼び出すと、プロンプトが表示されます。

    Lua 5.0  Copyright (C) 1994-2003 Tecgraf, PUC-Rio
    >
その後、入力する各コマンド(例:print "Hello World")は、<enter>キーを押すとすぐに実行されます。対話モードとインタプリタを終了するには、ファイルの終わり(Unixではctrl-D、DOS/Windowsではctrl-Z)を入力するか、オペレーティングシステムライブラリのexit関数(os.exit()<enter>と入力する必要があります)を呼び出します。

対話モードでは、Luaは通常、入力する各行を完全なチャンクとして解釈します。ただし、行が完全なチャンクを形成できないと検出された場合は、完全なチャンクになるまで、さらに入力を待ちます。Luaが行の継続を待っている場合、異なるプロンプト(通常は>>)を表示します。したがって、factorial関数などの複数行の定義を対話モードで直接入力できます。ただし、そのような定義をファイルに配置し、そのファイルをLuaが実行するように呼び出す方が便利な場合もあります。

-lオプションを使用して、スタンドアロンインタプリタへの引数としてすべてを指定することで、一連のチャンクを実行できます。たとえば、単一の文x=1を含むファイルaと、文print(x)を含むファイルbがある場合、コマンドライン

    prompt> lua -la -lb
は、a内のチャンクを実行してからb内のチャンクを実行し、期待される1を出力します。(-lオプションは実際にはrequireを呼び出します。これは特定のパスでファイルを探します。そのため、このパスにカレントディレクトリが含まれていない場合、前の例は機能しません。require関数は8.1節で詳しく説明します。)

-iオプションを使用して、指定されたチャンクを実行した後にインタラクティブセッションを開始するようにLuaに指示できます。次のようなコマンドライン

    prompt> lua -i -la -lb
は、a内のチャンクを実行してからb内のチャンクを実行し、その後、対話のためにプロンプトを表示します。これは、デバッグや手動テストに特に役立ちます。この章の最後に、スタンドアロンインタプリタのその他のオプションについて説明します。

チャンクをリンクするもう1つの方法は、ファイルをすぐに実行するdofile関数です。たとえば、lib1.luaというファイルがあるかもしれません。

    -- file 'lib1.lua'
    
    function norm (x, y)
      local n2 = x^2 + y^2
      return math.sqrt(n2)
    end
    
    function twice (x)
      return 2*x
    end
次に、対話モードで、次のように入力できます。
    > dofile("lib1.lua")   -- load your library
    > n = norm(3.4, 1.0)
    > print(twice(n))      --> 7.0880180586677

dofile関数は、コードをテストする場合にも役立ちます。2つのウィンドウを使用できます。1つはプログラムを含むテキストエディタ(例えば、ファイルprog.lua)、もう1つは対話モードでLuaを実行しているコンソールです。プログラムに加えた変更を保存した後、Luaコンソールでdofile("prog.lua")を実行して新しいコードを読み込みます。次に、その関数を呼び出して結果を出力することで、新しいコードを試すことができます。