コロン

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と名前が決められている。