-
Notifications
You must be signed in to change notification settings - Fork 7
Argument
#引数
##関数定義時の仮引数リスト
func(a){print(a);}
複数の引数の場合はカンマで区切って並べて書く
func(a, b){print(a+b);}
普通の変数宣言と同様に型を指定することも出来る
func(int a, int b){print(a+b);}
PSLでは型チェックは行われないが
呼び出す側が何を渡して呼び出してこようとも
intとして受け取ることが可能になる
##関数呼び出し時の引数
func(x);
複数並べる場合はカンマで区切って並べて書く
func(x, y);
関数適用演算子を使って複数の引数を渡す場合も同じである
func ` x , y;
##参照渡し 受け取る側に参照型を指定する
func(ref a){a = 1;}
int i = 0;
func(i);
print(i); // 1
受け取る側に型を指定せずに、渡す側で参照を渡す
func(a){a = 1;}
int i = 0;
func(&i);
print(i); // 1
参照を受け取る関数に、呼び出す際にも参照を作って渡しても 参照の参照にはならない
func(ref a){a = 1;}
func(&i);
ref a = &i;
の場合と同じである
##関数呼び出し時の引数の渡し方の仕組み
実質的に
func(a,b){}
に対してfunc(x,y);
と呼び出すことは
`a, b = x, y;'という多重代入式が実行されるのと同じである
(但し、右項が先に評価される点が異なる)
受け渡しが代入と同じであるというだけではなく
関数定義の括弧内も、関数呼び出しの括弧内も普通の式と全く同じである
func(local a, local b){}
の様に定義することも可能であるし
デフォルト引数や可変長引数などの仕組みを実現することも可能になる
注意点としては
func(a){}
と定義された関数は
通常の変数の扱い同様にaが既にglobal変数やstatic変数として存在していればそれを指すし
存在しなければ新たなローカル変数を作る、という挙動を示す点である
確実にローカル変数として仮引数を用意したければ
型指定宣言をするか、local宣言をする
func(int a){}
or func(local a){}
##高度な使い方
###デフォルト引数 func(int a, int b, (int c = 1)) { print("a = " + a + "\n"); print("b = " + b + "\n"); print("c = " + c + "\n"); } func(1, 2, 3); func(1, 2);
一つ目のfunc呼び出しでは1,2,3、二つ目では1,2,1と出力される
先述した通り
仮引数リストはただの式であることと
PSLは多重代入の都合による演算子優先順位があるので
func(int a, int b, int c = 1)
と書くことは
(int a, int b, int c) = (1)
という意味になる
多重代入時の左右の要素数の違う場合の挙動や、配列の扱いなどの様々な要素が絡み
思った通りに機能させられない場合も多いので十分に注意して運用すること
###可変長引数
ご存知の通り、a = 1,2,3;
とすればaは3要素の配列である
func(arg)
{
for (int i = 0; i < array.length(arg); i++)
print(arg[i]);
}
func(1, 2);
func(1, 2, 3);
func(1);
でもこの場合は結果的に動作するが、あまり信用しない方がいい
(arg = 1;となればargは配列ではなくただの数値の1となるのは自明である)