APL/J言語:動名詞とアジェンダ

動名詞(gerund)と式次第(アジェンダ)
英語では、動名詞ジェランドとは動詞の力を保持した名詞のことである。たとえばクッキングは料理する技術のことを指す言葉である。アジェンダはやるべきことのリストである。タイ接続詞`(バッククオート)は二つの動詞つないで動名詞を作り、そこから実行すべき要素が取り出されます。アジェンダ接続詞@.(アトマークドット)は動名詞に作用し、右側の動詞引数の結果が要素を決定します。

   g=: +`^
   a=:<
   2 a 3   NB.2 < 3は真なので1
1  
   2 g@.a 3   NB.2 a 3の結果1 => 2^3 => 8となる
8
   3 g@.a 2   NB.3 a 2の結果は0 => 3 + 2 => 5となる
5
   +:`-:`*:`%: @. (4&|@<.)"0 i. 10
0 0.5 4 1.73205 8 2.5 36 2.64575 16 4.5
   NB.i.10を4で割った結果で動名詞を選びi.10に作用させる
   NB.+:0,-:1,*:2,%:3,+:4,-:5,*:6,%:7,+:8,-:9

g@.aはケース文と呼ばれることがある。なぜなら場合(ケース)により動名詞が選ばれるからである。挿入(インサート)の副詞/(スラッシュ)は動名詞について動詞の時と似たような働きを持つ。

   c=:3 [ x=: 4 [ power=: _1
   g/ c,x,power
3.25
   3+x^_1   NB.cとxとpowerの間にg=:+`^が分解されて挿入
3.25

もし動名詞の要素数が不足の場合は繰り返される。

   +`*/1,x,3,x,3,x,1
125
   NB.1 + x * 3 + x * 3 + x * 1 
   NB.1 + 4 * 3 + 4 * 3 + 4 * 1
   NB.1 + 4 * 3 + 4 * 3 + 4
   NB.1 + 4 * 3 + 4 * 7
   NB.1 + 4 * 3 + 28
   NB.1 + 4 * 31
   NB.1 + 124
   NB.125

上記のこの文は二項係数1 3 3 1と引数xをホーナーの方法により効率的に評価した結果に対応するものです。


演習:
21.1 関数fを定義し、

   (x=: 4) f c=: 1 3 3 1

がホーナーの方法+`*/に対して用いられた引数と同じリストになるようにせよ。

答え: f=: }.@,@,.

   f=: }.@,@,.
   (x=: 4) f c=: 1 3 3 1
1 4 3 4 3 4 1
   NB.}.(波かっこドット、ブレイスドット)はリストの最初以外のリスト(rest)
   (x ,. c); (,(x ,. c)); }.(,(x ,. c))
 +---+---------------+-------------+
 |4 1|4 1 4 3 4 3 4 1|1 4 3 4 3 4 1|
 |4 3|               |             |
 |4 3|               |             |
 |4 1|               |             |
 +---+---------------+-------------+

考察:,.(カンマドット)は,"0(カンマクオートゼロ)と同じか?

   f=:}.@,@,"0
   (x=: 4) f c=: 1 3 3 1
1
3
3
1
   f=:}.@,@(,"0)
   (x=: 4) f c=: 1 3 3 1
1
3
3
1
   f=:}.@,@:(,"0)
   (x=: 4) f c=: 1 3 3 1
1 4 3 4 3 4 1

リスト単独だと,.(カンマドット)は,"0(カンマクオートゼロ)は同じであるが、@:(アトマーク、アトップ)との距離感が違うようである。