APL/J言語:単項動詞vs.二項動詞

J言語では同じ記号が単項動詞として使われるときと、二項動詞として使われるときと意味が違います。単行動詞とは動詞(関数)の右側だけに引数がある場合で、二項動詞は動詞(関数)の左右に引数がある場合です。
このことをAPL/J言語用語でアンビバレンスと呼ぶのですが、普通の英語ではそんな意味はないのでよくない用語だと思う。
混乱しそうな使い方ですが、実際はそれほどでもない。

   7-5   NB.7-5では引き算の意味のマイナス記号
2
   -5    NB.-5のような単項動詞ではプラスマイナスの符号を逆転させる意味
_5
   7%5    NB.二項動詞では割り算の意味の%(パーセント)
1.4
   %5    NB.単項動詞としては逆数の意味
0.2
   3^2   NB.二項動詞としてはべき乗の意味の^(キャレット)
9
   ^2    NB.単項動詞としては自然対数のn乗 2.71827^2
7.38906
   a=: i.5  NB.単項動詞としてのi.(アイドット)は0からnまでの整数生成
   a
0 1 2 3 4
   a i.3 1   NB.二項動詞では左側配列での右側の値の位置インデクスを返す
3 1
   b=: 'Canada'
   b i. 'da'  NB.i.(アイドット)文字列でも同様に位置インデクスを返す
4 1
   $ a   NB.$(ドルマーク)は単項動詞としてはシェイプと呼ばれ右側の引数の形を返す
5
   3 4 $ a   NB.$(ドルマーク)二項動詞としてはリシェイプと呼ばれ右側の日キスを左側の配列で指定した形に収納する。不足分は繰り返し、余った分は切り捨て
0 1 2 3
4 0 1 2
3 4 0 1
   3 4 $ b   NB.$(ドルマーク)は文字列でも同様の意味
Cana
daCa
nada
   %a   NB.関数(動詞)はリストにも作用する
_ 1 0.5 0.333333 0.25   NB._(アンダーバー)記号はそれだけでは無限の意味

(演習)実行してみて意味を考えよ

   a=: 3 1 4 1 5 9
   b=: 'Canada'
   #a   NB.#(シャープ)は単項動詞としてリストaの要素数を返す
6
   1 0 1 0 1 3 # a   NB.#(シャープ)は二項動詞としてはリストaから左側引数で指定した数だけコピーする。要素数の一致が必要
3 4 5 9 9 9
   1 0 1 0 1 3 # b   NB.文字列についても同様
Cndaaa
   /: a   NB./:(スラッシュコロン)は昇順ソートの取り出し順
1 3 0 2 4 5
   /: b   NB./:(スラッシュコロン)は昇順ソートの取り出し順
0 1 3 5 4 2
   a /: a  NB.自分自身に適用すると昇順ソート結果が得られる
1 1 3 4 5 9
   a /: b  NB.違うものでは無意味な結果になる
3 1 1 9 5 4
   b /: a
aaCnda
   b /: b  NB.アスキーコード順なので大文字が先
Caaadn
   c=: 'can''t'  NB.クオートを含む例
   c
can't
   c /: c  NB.アスキーコード順なのでクオートが先
'acnt
   ^.10   NB.^.(キャレットドット)の意味を調べる
2.30259
   ^.2.71828  NB.自然対数
0.999999
   2.71828 ^ 2.30259  NB.検算
10
   %: 4   NB.%:(パーセントコロン)の意味を調べる。ルートらしい
2
   %: -4  NB.引数がマイナスだと値は虚数
0j2
   +%: -4 NB.それに+(プラス)を作用すると共役(conjugate)を得る
0j_2
   <.1 2 3 4  NB.<.(小なりドット)の意味を調べる
1 2 3 4
   <.3.4 5.2 3.6  NB.<.(小なりドット)は整数部分を得る
3 5 3
   b=:3.4 5.2 3.6
   <.b+0.5  NB.0.5を足して<.(小なりドット)すると四捨五入になる
3 5 4
   2 4 3 $ i.5  NB.3ヶ月ごとの四半期の2年分の一覧のような表
0 1 2
3 4 0
1 2 3
4 0 1

2 3 4
0 1 2
3 4 0
1 2 3
   ?9
1
   ?9
0
   ?9
1
   ?9  NB.?(はてな)は0..n-1からランダムに選ぶ
5