10.フック&フォーク

フォークとフックについて説明します。フックフォークとはJ言語特有の 性質であり,この性質によりスクリプト(プログラム)を短くすることができます。 短くなって便利な反面,使いすぎると後でとてもわかりにくいということにもなります。 私もまだまだ自在に使うことはできません。 スクリプトたくさん読み,また,自分で簡単なものを作って見ることが, 使いこなすことのできるようになる方法です。
このあたりがJ言語の1つの山です。これがわかるようになれば,脱初心者。
それでは説明していきましょう。

フックとフォークとは

フォークとフックとは,動詞がいくつか並んだときに起こる演算順序のことを言います。 動詞が3つ並んだ場合にはフォークが, 2つ並んだ場合はフックが,それぞれ起こります。 フォークが最優先されるので,4つ以上のときには, まずフォークが起こり,それと残りの動詞とでさらに演算します。

フォーク

フォークとは,xyを引数,fghを動詞とすると, x (fgh) yは,
      g
       /   \
      f       h
    / \   / \
    x   y   x    y
のように演算することをいいます。 ただしfhが単項動詞のときはxはありません。つまり
      g
       /   \
      f       h
      |    |
     y      y
という感じに演算します。

フック

フックでもxyを引数,fghを動詞とすると,
          g
       /   \
      x       h
              |
              y
となります。hが単項動詞のときは,xyになる。 つまり、
          g
       /   \
      y       h
              |
              y
となります。

フォーク・フックの例

もし,あなたが上の説明だけで完璧に理解できたなら,かなりの頭の持ち主です。天才です。 ということで,普通ならわからないところだらけだと思いますので,実際にいくつか例をあげて フック・フォークについて説明します。
例1:両側引数をとった時のフォーク
1 3 5 (+;*) 2 4 6
+と;と*と三つ動詞が並んでいるのでフォークがおこります。 気をつけたいのは()でこの3つが囲まれているので フォークがおこるということです。 ()がないと,別の結果になります。
a=:+;*として別の文字に置き換えて使っても フォークはおこります。 それでは説明していきましょう。
例では上の図で当てはめると,
x=1 3 5
y=2 4 6
f=+
g=;
h=*
である。どう計算するかというと, xfyとxhyをまず計算します。この場合だと、
1 3 5+2 4 6と1 3 5*2 4 6を計算します。
そして出てきた答えをさらにgで計算します。 この場合だと, (1 3 5+2 4 6);(1 3 5*2 4 6) となります。つまり,フォークとは,動詞が3つ並んだとき 両端にあるものを先に計算し,そのあとその答えを 真中の演算子を作用させるということなのです。 見てのとおりはじめはわかりにくいですが慣れたら わかるようになります。
例2:片側引数をとったときのフォーク
(+/%#) 1 2 4 5 7
この場合はさっきの状況と少し違い左側に変数がありません。 同じようにフォークがおこるのですが、計算方法が少し違います。 上の図に当てはめてみる。 +/はひとつの動詞であることに注意して考えると、 y=1 2 4 5 7 f=+/ g=% h=# となります。 先ほどとの違いは演算子が片側で計算されるということです。 J言語では、同じ演算子でも両側に変数があるか、片側かで結果の 違うというのが普通です。 まず、hyである#1 2 4 5 7を計算します。#は片側であると、変数の個数を返します。 この場合は5個あるので結果は5です。 その次にfyである+/1 2 4 5 7を計算します。/は左側の演算子を右側のリストの間に 入れるという作用をします。つまり1+2+4+5+7を計算します。結果は19です。 その出てきたけったに対してgである%を作用させます。%とは割り算です。 つまり、19%5を計算します。結果は3.8となります。 この+/%#というのは足したものをその個数で割るということ、つまり、 平均を求めているのです。
平均他、いろいろな統計量を求めるスクリプトを スクリプト集にまとめてあります。参照してみてください。自分で理解することによって フォークの仕組みがわかると思います。