最近,我有一个光荣的主意,可以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
+/*:0".>,.2}.('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)
修改版本的工作方式与此相反:
echo +/*:@:>2}.ARGV
+/*:@:>2}.('/home/fred/j807/bin/jconsole';'./sumsquares.ijs';1;2;3)
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)