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 )
だから次のことができる。
■ 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で書かれた関数も呼べる