modifier の性質
verb は noun を引数にとり、noun の結果を返します。noun は、数値や文字列などの いわゆる「データ」のことです。つまり、verb は「データの処理」を表しています。
一方、modifier (adverb と conjunction) は異なる性質をもっています。
被演算子 | 結果 |
---|---|
noun (m / n ) または verb (u / v ) |
noun, verb, adverb, conjunction いずれも可 1 |
modifier は、noun や verb をパラメータとする「テンプレート」のようなものです。
adverb
adverb は、被演算子が 1 つの modifier です。被演算子は左側に置きます。
NB. (,) ~
,~
,~
3 行目は REPL の出力で、結果の verb が表示されています 2。
conjunction
conjunction は、被演算子が 2 つの modifier です。被演算子は左側と右側の両方に置きます。
NB. (0) & (,)
0&,
0&,
部分適用
conjunction の どちらか一方の被演算子を省略して、adverb を作ることができます。その adverb に被演算子を与えると、省略された部分が埋まります。
-@
-@
+(-@)
-@+
+(&1)
+&1
値の区分
ここまで、modifier として ひとまとめにして扱ってきましたが、adverb と conjunction は独立した区分です。J で扱う値には以下の 4 つの区分があります。
- noun
- verb
- adverb
- conjunction
verb は更に、monad と dyad を含んでいて、monad / dyad 両方の使い方ができる verb (+
など) もあります。一方、adverb と conjunction は別物なので、両方を兼ねることはできません。
modifier は値の区分ではなく、adverb と conjunction の総称です。
優先順位
verb と verb の間には優先順位の差はなく、常に右結合 (右から左の順) でしたね。
NB. - (2 * (3 - 1))
-2 * 3 - 1
_4
modifier どうしの間にも、優先順位の差はありませんが、modifier は常に verb よりも優先されます。また、実行の順序も、modifier が先です。
,&2 -3 NB. (, & 2) (- 3)
_3 2
] -3 NB. ] (- 3)
_3
- 1&, 4 NB. - ((1 & ,) 4)
_1 _4
- ] 4 NB. - ( ] 4)
_4
]
を使った例と比較すると、&
の結果が 1 つの verb として解釈されているのが分かりますね。verb を優先させるには、括弧を使います。
,&(2 - 3)
,&_1
(-1)&,
_1&,
結合性
verb とは異なり、modifier は左結合 (左から右) です。言葉では分かりにくいと思うので、実際に例を見てみましょう。
NB. ((+ /) @ i.) 10
+/@i. 10
45
+/
を以前に紹介した際に少し触れましたが、/
も adverb です。この例では、0 から 9 までの整数の総和を求めています。左側にある /
が、右側の @
よりも先に解釈されています 3。
複雑な式でも、同じです。どんな modifier でも左から右の順序に統一されているので、慣れれば難しくありません。
NB. ((1 & +) @ i.) 10
1&+@i. 10
1 2 3 4 5 6 7 8 9 10
NB. 2 ((% @ -) ~) 3
2 %@-~ 3
1
順序を変えるには、括弧を使います。
NB. (- @ (+ /)) 2 3 5
-@(+/) 2 3 5
_10
優先順位と結合性について、簡単にまとめておきます 4。
- modifier は verb よりも優先して左から右の順
- verb は右から左の順
[ 前 : 高階関数 ] [ 目次 ] [ 次 : 代入 ]