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