APL/J言語:&(アンド、ボンド接続詞)

ボンド接続詞(コンジャンクション)
^(キャレット、べき乗)のような二項動詞を使うと一連の単項動詞の機能を提供できます。

   ]b=: i.7
0 1 2 3 4 5 6
   b^2   NB.二乗
0 1 4 9 16 25 36
   b^3   NB.3乗
0 1 8 27 64 125 216
   b^0.5  NB.二乗根
0 1 1.41421 1.73205 2 2.23607 2.44949

ボンド接続詞の&(アンド、アンパーサンド)を使うと以下のように二項動詞の一方の引数を接続した動詞を定義できます。以下は例です。

   square=: ^&2  NB.二乗(べき乗and 2)
   square b
0 1 4 9 16 25 36
   (sqrt=: ^&0.5) b  NB.二乗根
0 1 1.41421 1.73205 2 2.23607 2.44949

左側の引数も同様に接続できます。

   Log=: 10&^.   NB.10を底とする対数(ロガリズム)
   Log 2 4 6 8 10 100 1000
0.30103 0.60206 0.778151 0.90309 1 2 3

こうして定義された動詞をフォークの中で使うことも可能です。

   in29=: 2&< *. <&9  NB.間隔判定
   in29 0 1 2 5 8 13 21
0 0 0 1 1 0 0
   IN29=: in29 # ]  NB.間隔選定(条件にあったものだけ選択)
   IN29 0 1 2 5 8 13 21
5 8
   LOE=: <+.=  NB.大なりまたはイコール
   5 LOE 3 4 5 6 7
0 0 1 1 1
   integertest=: <. = ]  NB.<.はフロア
   integertest 0 0.5 1 1.5 2 2.5 3
1 0 1 0 1 0 1
   int=: integertest
   int (i.13)%3
1 0 0 1 0 0 1 0 0 1 0 0 1

演習:
7.1 動詞の#(シャープ)はプログラムIN29において、二項動詞として使われている。(j=: 3 0 4 0 1) # i.5というような表現を入力し、評価して#(シャープ)の意味を述べよ。また、#j#i.5の結果の意味を記せ。(1j1#i.5も実行せよ)

   (j=: 3 0 4 0 1) # i.5 NB.0を3個、2を4個、4を1個コピーする
0 0 0 2 2 2 2 4
   #j#i.5  NB.その結果の個数を返す(+/jと同じ)
8
   1j1#i.5  NB.複素数の場合実数部分の数コピーされ虚数部分の数間隔が埋められる
0 0 1 0 2 0 3 0 4 0


7.2 以下のプログラムをリストに対し実行し、意味を述べよ。

   test1=: >&10 *. <&100  NB.10以上100未満か
   test1 1 2 10 50 130
0 0 0 1 0
   int=: ] = <.  NB.整数か
   int 0.5 1 1.5 _4 _3.5
0 1 0 1 0
   test2=: int *. test1   NB.整数かつ10以上100未満
   test2 0.5 1 1.5 _4 10 50 50.5 200
0 0 0 0 0 1 0 0
   test3=: int +. test1   NB.整数または10以上100未満
   test3 0.5 1 1.5 _4 10 50 50.5 200
0 1 0 1 1 1 1 1
   sel=: test2 # ]   NB.10以上100未満の整数を選択
   sel 0.5 1 1.5 _4 10 50 50.5 200
50

7.3 上記の意味から逆に定義を作成せよ。

7.4 演習6.4と6.5のf.(エフドット、定義の固定化)の副詞を振り返り、演習7.2に使用して実験せよ。

   test2
int *. test1
   test2=: int f. *. test1 f.
   test2
(] = <.) *. >&10 *. <&100
   test2 0.5 1 1.5 _4 10 50 50.5 200
0 0 0 0 0 1 0 0