在J脚本中,“ 0”。> ,. 2} .`部分有什么作用?

时间:2019-08-12 08:12:16

标签: j

最近,我有了一个光荣的主意,将J用作脚本语言(否则,我将永远不会在任何地方使用J)。 jsoftware页面上的示例按承诺工作。以下是sumsquares的代码:

#!/home/fred/j807/bin/jconsole
echo +/*:0".>,.2}.ARGV
exit''

据我所知ARGV是一个包含内容(以1 2 3作为参数)的装箱清单:

┌────────────────────────────┬────────────────┬─┬─┬─┐
│/home/fred/j807/bin/jconsole│./sumsquares.ijs│1│2│3│
└────────────────────────────┴────────────────┴─┴─┴─┘

但是,当在J REPL中执行时,它会失败(我希望这不仅仅是我这边的一些愚蠢的错误):

    +/*:0".>,.2}. ('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)
|domain error
|   +/*:0    ".>,.2}.('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)

我认为,我可以解密其中的一部分:

  • 2}.:将两个字符串元素斩首
  • >:取消装箱/打开元素

但是其余的还是个谜。有人可以解释一下0".>,.2}.中发生了什么吗?尤其是0的东西。

也:
为什么它在脚本中起作用而不在REPL中起作用?

  • 使用脚本工作:echo +/*:0".>,.2}.ARGV
  • 不在REPL中工作:+/*:0".>,.2}.('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)

修改后的版本与之相反:

  • 不在脚本中运行:echo +/*:@:>2}.ARGV
  • 在REPL中工作:+/*:@:>2}.('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)

1 个答案:

答案 0 :(得分:5)

shell命令行将参数作为 strings 传递。当jconsole收到控制权时,ARGV是由 strings 组成的盒装数组,其中有些 look 类似于数字。

因此,在上面的示例中,ARGV中盒装数组的最后三个元素是 strings :'1''2''3', not 位数 1、2、3

在REPL中,当给出这样的表达式时:

'sumsquares';1;2;3

结果是一个包含字符串的框式数组,后跟三个数字 字符串)

表达式0".y被称为 Numbers ,其功能是将y数组的元素从 strings 转换为数字,从而替换坏数字< / em>和0。但是,如果数组包含非字符串,则会发生Domain error

请参阅以下示例:

   0".'123'
123
   0".'1.23'
1.23
   0".'1.23.4'
0
   0".'abc'
0
   0".123
|domain error
|   0    ".123

因此,数字和期望使用 strings 的混合使用会加剧您的困惑。

最后,正常运行的REPL线将是:

   +/*:0".>,.2}. ('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';'1';'2';'3')
14