関数(Function)


SYNTAX function ::= function funcbody funcbody ::= `(´ [parlist1] `)´ block end function 関数名( [引数list] ) 文 end
function func(x) print(x) return 1; end
local func = function(x) print(x) return 1; end local ret = func( 10 ); print ( ret );
POINT Lua では全ての関数は値になる。 (関数もファーストクラスオブジェクト) 関数定義も命令のひとつ. Host から呼ぶことも, Lua 自身から呼ぶことも可能 関数定義は実行可能な式. 関数型の値を持つ 関数が呼ばれると、実引数リストは仮引数リストの長さに調節される ( 多ければ,きりすてられる, たりなければ, nil がセット ) POINT 関数定義も、[ 関数名の名前を持つ変数 ]に [ 関数の実体を代入 ]していることになる。 add = function(x, y) return x*y end add(x, y);


関数呼び出し


POINT 複数の値をかえす f() -- 戻り値は0個に調節される g(f(), x) -- f()の戻り値は1個に調節される return f() -- f()の戻り値をすべて返す {f()} -- f()のすべての戻り値からなるリストを作る


可変引数


SYNTAX [ function(...) ]
function ( a, b, ... ) a = select(5, ...); -- 可変引数 5 番目取得. end
string.format function test(...) local arr = {...}; for i=1, #arr do print( arr[i] ); end end
do test( "a", "b", "c", 10 ); end function fnMyUpper( s ) local l = string.len( s ); local str = string.upper( s ); return l, str; end do local len, s; len, s = fnMyUpper( "aiueo" ); print( len.."\t"..s); end


複数の値を返す関数


( Stack を利用することで実現している Lua は複数の値を返すことができる。 関数は data を返す際に, push 代入する際に pop;
x, y = foo(); -- 実は pop している.
POINT 次の実行文では, stack 内容は消去される. x, y = 1, 2; も同様 ( stack に 1, 2 を push してから x, y へ pop ) だから次のことができる。
x, y = y, x;



return


SYNTAX return [ expression ] DESC 関数やチャンク (関数) から値を返すために使う POINT return, break は block の最後で利用できる。 function t.a.b.c:f (...) ... end t.a.b.c.f = function (self, ...) ... end POINT [ メソッド ]とは、暗黙の引数 self を余分に持つ[ 関数 ]


ラムダ関数(名前なし関数)


方針としては [ その場で 1 度しか利用しない関数 ]は, 名前なし関数にする. 登録済みの関数は 未使用になったら GC で回収される.
a = {} a[1] = { name="a", price=300 }; a[2] = { name="b", price=100 }; a[3] = { name="c", price=200 }; table.sort( a, function ( a, b ) return a.price > b.price end ); for i=1, #a do print( a[i].price ); end



文としての関数呼び出し


( 副作用を許すため, 関数呼び出しは文として実行可能 ) stat ::= functioncall // 戻り値はすべて捨てられる. Lua は Luaで書かれた関数もCで書かれた関数も呼べる