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

tok*_*osh 3 j

最近,我有一个光荣的主意,可以J用作脚本语言(否则,我将永远不会在任何地方使用J)。jsoftware页面中的示例按承诺工作。这里供参考sumsquares

#!/home/fred/j807/bin/jconsole
echo +/*:0".>,.2}.ARGV
exit''
Run Code Online (Sandbox Code Playgroud)

据我所知,这ARGV是一个包含内容的框式列表(带有1 2 3作为参数):

?????????????????????????????????????????????????????
?/home/fred/j807/bin/jconsole?./sumsquares.ijs?1?2?3?
?????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

但是,当在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)
Run Code Online (Sandbox Code Playgroud)

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

  • 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)

aks*_*aks 5

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

所以,在上面的例子中,在盒装阵列的最后三个元素ARGV字符串:“1”“2”“3”, 1,2,3。

在REPL中,当给出如下表达式时:

'sumsquares';1;2;3
Run Code Online (Sandbox Code Playgroud)

结果是一个装箱的数组,其中包含一个字符串,后跟三个数字 不是字符串)

表达0".y被称为号码和其功能是将阵列y的元素从转换字符串到数字,更换不良号码0。但是,Domain error如果数组包含非字符串,则会发生a 。

请参阅以下示例:

   0".'123'
123
   0".'1.23'
1.23
   0".'1.23.4'
0
   0".'abc'
0
   0".123
|domain error
|   0    ".123
Run Code Online (Sandbox Code Playgroud)

因此,混合使用的数字,其中字符串预期正在助长你的困惑。

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

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