我是一个新手,并尝试学习 J。有一个问题我已经有很长一段时间了。
什么是语句分隔符J
?我可以在 J 的同一行中写多个语句吗?
尽管 J 中的语句分隔符是换行符,但您可以使用始终返回其左参数的 Left 动词 (dyadic [) 将赋值语句分隔在一行上。由于 J 从右到左解析,Left 动词有效地分解语句,因为右参数被丢弃(尽管仍然会出现赋值等副作用)。
2 + 3 [ t=. 3 + 4
5
t
7
因此,在这种情况下,t 被分配 7,然后 3 [ t 被评估返回 3,它被添加到 2。相比之下,如果您使用 Right (dyadic ]),您可能会以不同的结果逆流而上。
2 + 3 ] t=. 6 + 4
12
t
10
这里 t 被赋值为 10,3] t 的结果是 t,其值为 10,然后将其添加到 2。
希望这会有所帮助,鲍勃
没有语句分隔符。或者更确切地说,语句分隔符是换行符。
正如MPelletier 所指出的,没有语句运算符,但您可以使用“赋值技巧”:在您第一次使用语句时(从右到左)将语句的结果分配给变量。例如:
而不是这个:
a =: 15
f =: (+/) % # i.a
g =: (-/) % # i.a
h =: ((-:g) * (+:f)) ^ ((-:f) * (+:g))
你可以这样写:
h =: ((-:g) * (+:f)) ^ ((-: f =. (+/) % #i.a) * (+: g =. (-/) % # i.a=.15))
或者,而不是:
mean =: (+/) % #
f =: mean i.15
这个:
f =: (mean =: (+/) % #) i.15
替代Do ,您可以使用".
Explicit Verb3 :
创建一个匿名动词并调用它。这样你就不用担心临时变量泄露了。
对于多个语句,您有一些方法:
[
(ex. 'bar =. foo + 54 [ foo =. 42'
)'foo =. 42' , LF , 'bar =. foo + 54'
)'foo =. 42' ,: 'bar =. foo + 54'
)。借用Eelvex 的例子:
(3 : 'h =. ((-:g) * (+:f)) ^ ((-:f) * (+:g)) [ g =. (-/) % # i.a [ f =. (+/) % # i.a [ a =. 15') ''
0.976216
(3 : ('a =. 15' ,LF, 'f =. (+/) % # i.a' ,LF, 'g =. (-/) % # i.a' ,LF, 'h =. ((-:g) * (+:f)) ^ ((-:f) * (+:g))')) ''
0.976216
(3 : ('a =. 15' , 'f =. (+/) % # i.a' , 'g =. (-/) % # i.a' ,: 'h =. ((-:g) * (+:f)) ^ ((-:f) * (+:g))')) ''
0.976216
3 : <...>
在通常的从右到左执行之前以某种方式被评估,因此您需要为:
. 使用此行为,您可以省略括号3 : <...>
:
3 : '6 * 9' ''
54