我是新手,并试着学习J.我有一个问题已经有很长一段时间了。
J
中的语句分隔符是什么?我可以在J的同一行写几个语句吗?
答案 0 :(得分:4)
虽然J中的语句分隔符是换行符,但您可以使用左侧动词(dyadic [)将单个赋值语句分开,该动词始终返回其左侧参数。由于J从右向左解析,因此左侧动词会在丢弃正确的参数时有效地分解语句(尽管仍然会发生分配等副作用)。
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.
希望这有帮助,鲍勃
答案 1 :(得分:3)
没有语句分隔符。或者更确切地说,语句分隔符是换行符。
答案 2 :(得分:3)
如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
答案 3 :(得分:1)
替代Do ".
,您可以使用Explicit Verb 3 :
创建匿名动词并调用它。这样您就不必担心泄漏的临时变量。
对于多个陈述,您有一些方法:
[
(例如'bar =. foo + 54 [ foo =. 42'
)'foo =. 42' , LF , 'bar =. foo + 54'
)'foo =. 42' ,: 'bar =. foo + 54'
)。 (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