関数の呼び出し

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形の関数コールは、テールコールと呼ばれる。 Luaは'適切なテールコール(または'適切な'末尾再帰 )を実装している。テールコールでは、呼び出された関数は呼び出し元の'function.Thereforeのスタックエントリを再利用する。 しかし、終端呼び出しは、 呼び出し側関数に関するデバッグ情報を削除します。 終端呼び出しは、return に引数として単一の関数呼び出しがあるという特別な構文でのみ発生することに注意してください。この構文により、呼び出し側関数は正確に呼び出し先関数の戻りを返すようになります。 そのため、次の例は、どれも終端呼び出しではありません。
return (f(x)) -- results adjusted to 1
return 2	* f(x) -- additional results
return x, f(x)	
f(x); return -- results discarded
return x	or f(x) -- results adjusted to 1