tacit definition
フックやフォークなどの、noun 以外の値を作る字句の並びを train と呼び、train を使った定義を tacit definition (暗黙の定義) と言います。
average=: +/ % #
tacit definition は、シンプルな計算を定義するのに向いていますが、複雑なアルゴリズムなどを記述するのは困難です。
explicit definition
explicit definition (明示的な定義) は、具体的な処理を記述して verb などを定義する機能です。
上の average
の例を explicit definition で表現すると、以下のようになります 1。
average=: monad define
sum=. +/y
count=. #y
sum % count
)
まず 1 行目を見てみましょう。monad define
とありますが、これが explicit definition を開始します。文字通り monad を定義しています。
5 行目の )
までが、explicit definition の本体になります (この )
に対応する (
はありません)。
explicit definition の内部では、ローカル変数を使うことができます。引数 y
もローカル変数です。ローカル変数へ代入するときは、=.
を使います。
複数の文 (sentence) を続けて実行するには、改行で区切って並べます。*1 行に複数の文を書いたり、1 つの文を複数行にわたって書くことはできません。*最後に実行した文の結果が、verb の返す値になります。
種類
verb に加えて modifier の定義もできます。
定義方法 | 内容 |
---|---|
monad define |
monad |
dyad define |
dyad |
verb define |
monad と dyad 両方の使い方ができる (dual-valence) verb |
adverb define |
adverb |
conjunction define |
conjunction |
verb
monad define
の場合は引数 y
、dyad define
の場合は引数 x
と y
が定義されています。
negate=: monad define
-y
)
negate 1
_1
subtract=: dyad define
x - y
)
3 subtract 1
2
verb define
の定義部分は、monad バージョンと dyad バージョンを :
で区切って書きます。順番は monad
・dyad
の順です。
minus=: verb define
NB. monad
-y
:
NB. dyad
x - y
)
minus 1
_1
3 minus 1
2
modifier
adverb define
では、u
か m
が被演算子を表します。verb の被演算子を受け付ける場合は u
を、noun の被演算子を受け付ける場合は m
を使います。
modifier は、noun, verb, adverb, conjunction のいずれの値も返すことができます。
NB. u を 2 回適用する verb を返す
twice=: adverb define
u@u
)
0&,twice 1
0 0 1
NB. 文字列 m のバイト値 (noun) を返す
bytes=: adverb define
a. i. m
)
'Text'bytes
84 101 120 116
被演算子の種類が一致しない場合 (間違った使い方をした場合) はエラーになります。
3 twice
|domain error
| u @u
+bytes
|value error
| a.i. m
verb を返す modifier の場合、x
・y
を使って verb の定義をそのまま書くこともできます。verb define
と同様に :
が monad・dyad を区切る役割をします。この方法で定義するときは、noun を返す必要があります。
NB. 引数と u の結果を返す
show=: adverb define
y ; u y
:
x ; y ; x u y
)
-show 1
┌─┬──┐
│1│_1│
└─┴──┘
3 -show 1
┌─┬─┬─┐
│3│1│2│
└─┴─┴─┘
conjunction define
も adverb と同じように定義できます。右の被演算子は v
(verb の場合) または n
(noun の場合) です。
注意点
explicit definition には、いくつか注意するべき点があります。
まず、explicit definition を入れ子にすることはできません。これには多分歴史的な事情もあると思うのですが、代替の構文 2 があるので困ることはありません。
もう一点、区切りや終端を表す :
と )
の行にはスペース (インデント) は入れてもいいですが、他の文字を含んではいけません。コメントもダメです 3。
[ 前 : フックとフォーク ] [ 目次 ] [ 次 : 複数行のリテラル ]