関数呼び出し

Lua の関数呼び出しの構文は次のとおりです。

      functioncall ::= prefixexp args

関数呼び出しでは、まず prefixexp と args が評価されます。prefixexp の値が関数 型であれば、 この関数が指定された引数で呼び出されます。そうでない場合、prefixexp の「call」メタメソッドが呼び出されます。そのとき、prefixexp の値が最初のパラメーターとして渡され、その後、オリジナルの呼び出し引数が続きます。

形式

      functioncall ::= prefixexp `:´ Name args

は、「メソッド」の呼び出しに使用できます。呼び出し v:name(args)は、v.name(v,args)の糖衣構文で、v が 1 回だけ評価される点が異なります。

引数の構文は次のとおりです。

      args ::= `(´ [explist] `)´
      args ::= tableconstructor
      args ::= String

引数のすべての式は呼び出しの前に評価されます。形式 f{fields} の呼び出しは f({fields}) の糖衣構文です。すなわち、引数リストは単一の新しい表です。形式 f'string' (あるいは f"string" または f[[string]]) の呼び出しは、f('string') の糖衣構文です。すなわち、引数リストは単一のリテラル・ストリングです。

Lua のフリー・フォーマット構文の例外として、関数呼び出しの「(」の前で改行することはできません。この制限によって、言語のあいまいさが多少避けられます。以下のように書いた場合、

     a = f
     (g).x(a)

Lua は単一のステートメント a = f(g).x(a) と解釈するかもしれません。したがって、2 つのステートメントにしたい場合は、 間にセミコロンを追加する必要があります。実際は f を呼び出したい場合は、(g) の前の改行を削除する必要があります。

return functioncall 形式の呼び出しは、終端呼び出し と呼ばれます。Lua は、終端呼び出し最適化 (または終端再帰最適化) を実装しています。終端呼び出しでは、呼び出された関数は呼び出し側関数のスタック・エントリーを再利用します。その結果、 終端呼び出しのネスト数の制限なしにプログラムを実行できます。しかし、終端呼び出しは、 呼び出し側関数に関するデバッグ情報を削除します。終端呼び出しは、return に引数として単一の関数呼び出しがあるという特別な構文でのみ発生することに注意してください。この構文により、呼び出し側関数は正確に呼び出し先関数の戻りを返すようになります。そのため、次の例は、どれも終端呼び出しではありません。

     return (f(x))        -- results adjusted to 1
     return 2 * f(x)
     return x, f(x)       -- additional results
     f(x); return         -- results discarded
     return x or f(x)     -- results adjusted to 1