メインコンテンツまでスキップ

関数

関数の定義

-> を使って関数を定義します.下のコードは,引数 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; // () と表示される

複数の引数を受け取る関数

下のコードで定義される addab の和を求める関数です.

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)