`0".>,.2}.` 部分在 J 脚本中的作用是什么?

What does the `0".>,.2}.` part do in the J-script?

最近我灵机一动,想把 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)

我想,我可以破译它的一部分:

但其余的有点神秘。任何人都可以向我解释 0".>,.2}. 中发生了什么吗?特别是 0.

还有:
为什么它在脚本中有效但在 REPL 中无效?

修改后的版本以相反的方式工作:

shell 命令行将参数作为 字符串 传递。当 jconsole 接收到控制权时,ARGV 字符串 的盒装数组,其中一些 看起来 像数字。

因此,在上面的示例中,ARGV 中盒装数组的最后三个元素是 字符串 : '1' '2' '3', 不是 位数 1, 2, 3.

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

'sumsquares';1;2;3

结果是一个包含一个字符串的盒装数组,后跟三个数字 (不是字符串).

表达式0".y被称为Numbers,其功能是将数组y的元素从strings转换为数字,将 错误数字 替换为 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

因此,混合使用 数字 而预期 字符串 会导致您感到困惑。

最后,正确运行的 REPL 行将是:

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