3

我是一个新手,并尝试学习 J。有一个问题我已经有很长一段时间了。

什么是语句分隔符J?我可以在 J 的同一行中写多个语句吗?

4

4 回答 4

4

尽管 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。

希望这会有所帮助,鲍勃

于 2013-07-22T17:33:06.920 回答
3

没有语句分隔符。或者更确切地说,语句分隔符是换行符。

于 2013-07-18T20:59:46.643 回答
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
于 2013-07-18T21:57:29.017 回答
1

替代Do ,您可以使用".Explicit Verb3 :创建一个匿名动词并调用它。这样你就不用担心临时变量泄露了。

对于多个语句,您有一些方法:

  1. 反转语句并加入 with [(ex. 'bar =. foo + 54 [ foo =. 42')
  2. 使用换行符连接(例如'foo =. 42' , LF , 'bar =. foo + 54'
  3. 形状代码作为表格(例如'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
于 2014-06-08T15:37:35.970 回答