【发布时间】:2016-10-31 16:11:25
【问题描述】:
我是新手,想学J。有一个问题我有一段时间了。
J 中的语句分隔符是什么? J可以在同一行写几条语句吗?
【问题讨论】:
标签: j
我是新手,想学J。有一个问题我有一段时间了。
J 中的语句分隔符是什么? J可以在同一行写几条语句吗?
【问题讨论】:
标签: j
虽然 J 中的语句分隔符是换行符,但您可以使用始终返回其左参数的左动词 (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
【讨论】:
a =. 3 *2 [ z=. 8 [ (b=: 3 :'+:y') [ c=. *:9.
没有语句分隔符。或者更确切地说,语句分隔符是换行符。
【讨论】:
替代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
【讨论】: