APL/J言語:フォーク

前章で述べたように、3つの動詞がひとつながり(sequence)となって前後から独立している場合をフォーク(fork)と呼び、単項動詞の場合と二項動詞の場合、下記のように定義できる。

  g             g
 / \           / \
f   h         f   h
/ \ / \
y y x y x y

図は、視覚的なイメージである。
以下の各文を実行し意味を述べよ。なお、%:(パーセントコロン)はルートを求める動詞であり、](右角かっこ)はアイデンティティ関数である。

   a=: 8 7 6 5 4 3
   b=: 4 5 6 7 8 9
   2 %: b   NB.bの二乗根
2 2.23607 2.44949 2.64575 2.82843 3
   3 %: b   NB.bの三乗根
1.5874 1.70998 1.81712 1.91293 2 2.08008
   (+/ % #) b  NB.bの算術平均(arithmetic mean or average)
6.5
   (# %: */) b  NB.bの幾何平均
6.26521
   (] - (+/ % #)) b  NB.平均からの乖離(二重フォーク)
_2.5 _1.5 _0.5 0.5 1.5 2.5
   (] - +/ % #) b  NB.同上(かっこなし)
_2.5 _1.5 _0.5 0.5 1.5 2.5
   a (+ * -) b   NB.二項動詞のフォークの例
48 24 0 _24 _48 _72
   (a^2)-(b^2)
48 24 0 _24 _48 _72
   a (< +. =) b  NB.小なりまたはイコール
0 0 1 1 1 1

平均からの乖離はフォークとフックの組合せの方が普通かと思うけど、まだこれからなのかな?

   (- (+/%#)) b
_2.5 _1.5 _0.5 0.5 1.5 2.5
   (-+/%#) b
_2.5 _1.5 _0.5 0.5 1.5 2.5

演習:
5.1 #(シャープ)という動詞の二項動詞としての意味について、5#3のような表現を評価し、結果をみて意味を述べよ。また(# # >./) b=:2 7 1 8 2を評価し、意味を述べよ。

   5#3
3 3 3 3 3
   2# 1 2 3
1 1 2 2 3 3
   (# # >./) b=: 2 7 1 8 2
8 8 8 8 8

答え:bの中の最大値を#b回コピーする

5.2 以下の表現を評価し、意味を述べてコメントと比較せよ

   (+/ % #) b   NB.リストbの平均
4
   (# # +/ % #) b   NB.bの平均をbの個数コピー
4 4 4 4 4
   +/(##+/%#) b   NB.上記の合計
20
   (+/b)=+/(##+/%#) b   NB.リストの合計=平均x個数
1
   (*/b)= */(###%:*/) b   NB.掛け算は幾何平均x個数
1
<