APL/J言語:プログラム

演奏会で渡されるプログラムは演奏される曲目の名称や解説です。語源的にはgramとproから成っていて、プログラムとはそこに書かれていることが起きる以前に書かれるもののことです。
その意味で、前章で述べたフォークの+/ % #は実際に文として(+/%#)bというように引数bと共に実行されて平均が計算されるので、プログラムです。しかしながら、通常、この様な手続き(処理、プロシージャ)は名称をつけて初めてプログラムと呼ばれます。

   mean=: +/ % #
   mean 2 3 4 5 6
4
   (geomean=: # %: */) 2 3 4 5 6
3.72792

meanというプログラムは新しい動詞なので、mean=: +/ % #のような文は動詞の定義です。定義された動詞はさらに新しい動詞の定義に使えます。いわゆる構造化プログラミングになります。

   MEAN=: sum % #
   sum=: +/
   MEAN 2 3 4 5 6
4

動詞だけで引数をつけないで入力(評価)すると、定義部分が返されます。どういうフォームで返すか(ボックス、ツリー、リニア、かっこつき)は外部接続詞(!:)を使って指定できます。また、メニューのコンフィギュアを使っても指定できます。

   mean
 +/ % #
   9!:3 (2 4 5)
   mean
 +-----+-+-+
 |+-+-+|%|#|
 ||+|/|| | |
 |+-+-+| | |
 +-----+-+-+
   +- / --- +
 --+- %      
   +- #    
 +/ % #

演習:
6.1 AT=: i. +/ i.として、 AT 5というような表現を評価して、プログラムATの作用を推定せよ。

   AT=: i. +/ i.
   AT 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

答え:ゼロから引数マイナス1までの足し算表

6.2 似たような二項動詞を使って関数テーブルを作成せよ。

   MT=: i. */ i.
   MT 5
0 0 0  0  0
0 1 2  3  4
0 2 4  6  8
0 3 6  9 12
0 4 8 12 16

6.3 下記のプログラムを定義し、整数にtest1を作用させることにより、test1と演習6.1のATが同じ作用であることをテストする。また、ftとATを引数なしに入力し、定義を表示させよ。

   tab=: +/
   ft=: i. tab i.
   test1=: ft = AT
   test1 5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
   ft 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
   ft
i. tab i.
   AT
i. +/ i.

6.4 aft=: ft f.を定義し、test2=: aft = ftを用いてaftとftが同じでることをテストする。 それぞれの定義を表示し、f.という副詞の意味を述べよ。

   aft=: ft f.
   test2=: aft = ft
   test2 5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
   aft
i. +/ i.
   ft
i. tab i.

答え:副詞f.は定義内で使われている動詞を名称でなく定義に書き換えて定義を確定する。

6.5 演習6.3で定義されたtabをtab=: */と再定義し、動詞ftとaftへの影響を観察せよ。

   tab=: */
   ft 5
0 0 0  0  0
0 1 2  3  4
0 2 4  6  8
0 3 6  9 12
0 4 8 12 16
   aft 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

6.6 mean=: +/ % #を定義し、テーブルに作用させた場合の行動を述べよ。mean t=: (i. !/ i.) 5を実行せよ。

   mean=: +/ % #
   mean i.3 3
3 4 5
   mean t=: (i. !/ i.) 5
0.2 0.4 0.8 1.6 3.2
   (i. !/ i.) 5
1 1 1 1 1
0 1 2 3 4
0 0 1 3 6
0 0 0 1 4
0 0 0 0 1

答え:結果は表引数の行ごとの平均になる。

6.7 列の平均を得るにはどうしたらよいか?

   mean |: t
1 2 2 1 0.2
   mean"1 t
1 2 2 1 0.2

答え: |:(トランスポーズ、たてよこ交換)を使うかランク接続詞の"1(クオートいち)を使ってmean"1とする。