最近,我有了一个光荣的主意,将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
+/*: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)
答案 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