コロン
Jでコロンって今までExplicitな定義にしか使ってなかったけど、実際は二つの意味があるようで。
ひとつはExplicit Definitionで、これは引数が名詞のとき。
で、もうひとつがMonad-Dyadでこれは引数が動詞のとき。
Monad-Dyadっていうのは単項と二項の両方として動作する動詞を作れる。つまり、組み込みの動詞、たとえば + は、単項だと複素共役で二項だと加算、っていう使い方になるわけだけど、自分で定義した動詞で同じようなことをしようと思ったとき、これを知らないと困る。
普通はExplicit Definitionでオブジェクトを定義するんだけど、Explicit Definitionとしてのコロンが左辺にとる値っていうのが、これから定義するオブジェクトの種類を表しているので、単項と二項で両方使えるものを定義できない。
Explicit Definitionの左辺にくる値の意味は以下の通り。
- 0 ・・・名詞
- 1 ・・・副詞
- 2 ・・・接続詞
- 3 ・・・動詞
- 4 ・・・二項動詞
- 13 ・・・動詞(もしもJ側が暗黙の定義に変換できるならば変換し、できないならば3と同じように定義)
で、Explicit Definitionの左辺に3を置けば、基本的には(Monad-Dyadを使わない限りは)単項動詞になるし、4を置けば二項動詞になるので、両方使えるものが定義できない。
そこでMonad-Dyadを使うんだけれど、まずは暗黙の定義にMonad-Dyadを使った例をあげてみる。
pow =: 2&^ : ^ pow 4 16 3 pow 4 81
powの定義でコロンの左にあるのが単項の場合、右にあるのが二項の場合。これは単項で使うと2の累乗を計算し、二項で使うと任意の数を底とする累乗を計算する。
次に明示的な定義にMonad-Dyadを使ってみる。
pow =: 3 : 0 2^y : x^y ) pow 4 16 3 pow 4 81
見てのとおり、先に定義したものとまったく同じものになる。
補足
Explicit Definitionとしてのコロンの右辺に0を置くと、複数行に亘る定義が可能。
Jでは単項同士の引数はy、二項動詞の引数は左辺がx,右辺がyと名前が決められている。