`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)
我想,我可以破译它的一部分:
2}.
:斩首两个字符串元素
>
: unboxing/opening 元素
但其余的有点神秘。任何人都可以向我解释 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)
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
最近我灵机一动,想把 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}.
:斩首两个字符串元素>
: unboxing/opening 元素
但其余的有点神秘。任何人都可以向我解释 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)
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