explicit definition の欠点の一つは、入れ子にできないことです。それを補うために direct definition という構文があります 1。
構文
direct definition (直接的な定義) は、{{
と }}
で定義部を囲う構文です。
average=: {{
sum=. +/y
count=. #y
sum % count
}}
一行で書くこともできます。
average=: {{ (+/y) % (#y) }}
explicit definition とは異なり、最後の }}
の直後に式を続けられます。また、入れ子にして使うこともできます。
1 {{
f=. {{ x , y }}
y f x
}} 2
2 1
direct definition と explicit definition
direct definition の実体は explicit definition で、両者には構文上の違いしかありません。
{{ x + y }}
4 : 'x + y '
explicit definition は ほとんど direct definition で置き換え可能です。ただし、Note
でコメントアウトする方法は direct definition では使えません。(そのため、グローバルな変数の定義では explicit definition を使った方が便利かもしれません。)
種類の指定
direct definition は、monad, dyad 等の種類を指定しなくても使われている変数名から自動で決定してくれます。具体的には以下のように決定されます。
-
v
かn
が使われていれば conjunction - そうでなく
u
かm
が使われていれば adverb - そうでなく
x
が使われていれば dyad か dual-valence - そうでなければ monad
明示的に何を定義するのか指定することもできますが、少し変わった構文になります。{{
の直後に閉じ括弧 )
と次の表の 1 文字を続けます。
文字 | 種類 |
---|---|
* |
デフォルト (何も指定しないのと同じ) |
m |
monad |
d |
dyad |
v |
verb |
a |
adverb |
c |
conjunction |
n |
noun |
NB. monad と dyad を : で区切るのは explicit definition と同じ
{{)v
<y
:
x ; y
}}
3 : 0
<y
:
x ; y
)
{{)
を書いた行には、それより後に書いてもよいのはコメントとスペースだけです。
noun
noun の direct definition は特殊な構文になっています。{{)n
の直後から文字列が始まり、2 種類の書き方ができます。
一行
{{)n
のある行に }}
がある場合、そこまでが文字列になります。'
(シングルクォーテーション) を含む文字列リテラルを書くのに便利です 2。
{{)nText '...'}}
Text '...'
{{)n
の後にスペースは要らないことに注意してください。
複数行
{{)n
がその行で終わらない場合、次に行の先頭に }}
が現れるまで文字列が続きます。他の位置にある }}
は単に文字列の一部になります。
{{)nabcde
12345
... }}
}}
abcde
12345
... }}
最後の改行は文字列に含まれます。{{)n
の次の文字が改行の場合は、その改行は文字列に含まれません。
[ 前 : define の実体 ] [ 目次 ] [ 次 : 制御構文 ]