値 (noun) の型の次は、verb の説明をします。verb は、これまでに出てきたように、「関数」に似た機能です。ここでは、もう少し掘り下げてみようと思います。
引数の数と名前
verb と他の言語の「関数」の違いの一つは、引数の数です。J の verb は、引数が 1 個の monad と引数が 2 個の dyad だけです。3 個以上の値を渡したい場合は、配列やボックスを使います。
monad
monad の場合、引数は verb の右側に 1 つだけです。この引数には、y
という名前がついています。実際に y
という変数が定義されているわけではありませんが、慣習的に この名前で呼ばれています。
NB. - y
- 3
dyad
dyad の場合、2 つの引数のうち、左側は x
、右側は上と同様に y
と呼びます。これらの名前は頻繫に使うので、覚えておいてください。
NB. x - y
5 - 3
何もしない verb
verb の中には、計算をせず、引数を返すだけのものがあります。単独では使いませんが、他の機能と組み合わせると便利な場合があります。
]
]
は、右の引数 (y
) を返す verb です。monad も dyad も、常に y
を返します。
]3
3
5 ] 3
3
[
[
は、左の引数 (x
) を返す verb です。dyad は x
を返しますが、monad の場合は x
の代わりに y
を返します 1。
[3
3
5 [ 3
5
代入との組み合わせ
]
と [
は、代入 (=:
) と一緒に使うと便利です。
代入 a=: b
の実行結果は b
と同じ値です 2 が、最後に実行した式が代入の場合、 REPL は その結果は表示しません。
NB. 実行結果は 100 だけど、次の行に表示されない
a=: 100
NB. b には a=: 200 の実行結果 (200) が代入される
b=: a=: 200
しかし、代入と同時に代入した値を確認したい場合があります。以下のように変数名を再入力すれば確認できます 3 が、2 回に分けて入力するのは面倒ですよね。
a=: i.3
a
0 1 2
そこで役に立つのが ]
(monad) です。代入の結果を ]
に渡すことで、最後に実行されるのが ]
になるので、REPL は結果を表示します。もちろん、[
(monad) を使っても同じです。
NB. ] (a=: i. 3)
]a=: i.3
0 1 2
さらに、複数の代入を一行で実行したい場合には、[
(dyad) が使えます。
NB. a=: i. (3 [ (b=: 'abc' ; 'de'))
a=: i.3 [ b=: 'abc' ; 'de'
一見何をしているのか分かりづらいですが、式の実行の順序 (右から左) を考えれば解読できると思います。
[ 前 : データ型のまとめ ] [ 目次 ] [ 次 : 高階関数 ]