如何在J中的同一行写几个语句

时间:2013-07-18 20:24:49

标签: j

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

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

4 个答案:

答案 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 :创建匿名动词并调用它。这样您就不必担心泄漏的临时变量。

对于多个陈述,您有一些方法:

  1. 反向声明并加入[(例如'bar =. foo + 54 [ foo =. 42'
  2. 带有换行符的Concat(例如'foo =. 42' , LF , 'bar =. foo + 54'
  3. 将代码整形为表格(例如'foo =. 42' ,: 'bar =. foo + 54')。
  4. 借用Eelvex's example

       (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