関数
関数の定義
-> を使って関数を定義します.下のコードは,引数 n に対して n + 1 を返す関数を定義しています.
n -> n + 1;
定義した関数を変数に束縛して呼び出します.
increment = n -> n + 1;
println(increment 3); // 4
あるいは,定義と同時に呼び出します.
println((n -> n + 1) 3); // 4
呼び出しにはパイプ式 >- および -< も使用できます.
"Hello World" >- println; // Hello World
n -> n + 1 -< 3 >- println; // 4
複数の式を評価する関数
関数内で複数の式を評価する場合は,丸括弧 () またはインデントを用いて式をグループ化します.グループ内の式はセミコロン ; で区切ります.最後に評価された式の値が,グループ式の値となります.
increment = n ->
return = n + 1;
return
;
println -< increment 1; // 2
上のコードでは,引数 n を受け取って return という変数に n + 1 を代入し,return の値を返す関数 increment を定義しています.
グループ式の最後の式にはセミコロン ; を付けていません.式の末尾に ; をつけた場合,関数は常に () を返すようになります.右辺のない ; は常に () を返すためです.
increment = n ->
return = n + 1;
return;
;
println -< increment 1; // () と表示される
複数の引数を受け取る関数
下のコードで定義される add は a と b の和を求める関数です.
add = a -> b -> a + b;
add 1 2 >- println; // 3
add は 2 つの引数を受け取るように見えますが,実際には引数を 1 つだけ受け取っています.つまり,add は引数 a を受け取って b -> a + b を返す関数です.
Punyochi の関数は常に 1 つの引数を受け取ります.複数の引数を扱いたい場合は,上の例のように,関数を返す関数を定義します.
add の定義を,ほぼ等価な JavaScript で書き換えると以下のようになります.
var add = (a) => (b) => a + b;
console.log(add(1)(2)); // 3
関数の中置記法
関数名に : をつけることで,関数を演算子のように扱うことができます.
add = a -> b -> a + b;
println(1 :add 2); // 3
関数からの早期脱出
-> 構文により,以降の式を評価せずに関数を脱出します.
add = a -> b ->
println("add " a " and " b);
-> a + b;
println("unreachable");
;
println(add 1 2); // 3
他の多くの言語にある return に似ていますが,-> 構文はネストすることができます.
f = a -> b ->
add = a -> b ->
-> -> a + b;
;
add 1 2;
println("unreachable");
;
println(f 1 2); // 3
デコレータ
@ 構文 (ループとは異なります) を使って,関数を修飾します.下のプログラムでは,足し算の結果を文字列に変換して返す関数 add を定義しています.
add = @String a -> b -> a + b;
println(add 1 2 + 3); // 33
デコレータをカスタム定義します.
parenthesize = s -> "(" s ")";
transform = @parenthesize s -> s.reversed;
println(transform "hello"); // (olleh)