10.フック&フォーク
フォークとフックについて説明します。フックフォークとはJ言語特有の
性質であり,この性質によりスクリプト(プログラム)を短くすることができます。
短くなって便利な反面,使いすぎると後でとてもわかりにくいということにもなります。
私もまだまだ自在に使うことはできません。
スクリプトたくさん読み,また,自分で簡単なものを作って見ることが,
使いこなすことのできるようになる方法です。
このあたりがJ言語の1つの山です。これがわかるようになれば,脱初心者。
それでは説明していきましょう。
フックとフォークとは
フォークとフックとは,動詞がいくつか並んだときに起こる演算順序のことを言います。
動詞が3つ並んだ場合にはフォークが,
2つ並んだ場合はフックが,それぞれ起こります。
フォークが最優先されるので,4つ以上のときには,
まずフォークが起こり,それと残りの動詞とでさらに演算します。
フォーク
フォークとは,x,yを引数,f,g,hを動詞とすると,
x (fgh) yは,
g
/ \
f h
/ \ / \
x y x y
のように演算することをいいます。
ただしf,hが単項動詞のときはxはありません。つまり
g
/ \
f h
| |
y y
という感じに演算します。
フック
フックでもx,yを引数,f,g,hを動詞とすると,
g
/ \
x h
|
y
となります。hが単項動詞のときは,xはyになる。
つまり、
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となります。
この+/%#というのは足したものをその個数で割るということ、つまり、
平均を求めているのです。
平均他、いろいろな統計量を求めるスクリプトを
スクリプト集にまとめてあります。参照してみてください。自分で理解することによって
フォークの仕組みがわかると思います。