考虑:
x=.4 5 6 7
i.# x
0 1 2 3
这是预期的。钩子#
作用于参数(列表4 5 6 7
),返回其长度4
,然后传递给i.
,数字0到3是打印。
但是,如果我首先将动词短语分配给变量,然后然后将它应用于同一个列表,我会得到一个不同的答案:
y=.i.#
y x
0
为什么?
答案 0 :(得分:3)
(i. #) y
是一个钩子,而i. # y
只是从右到左评估参数。 v1 v2 v3 v4 v5 y
相当于v1 (v2 (v3 (v4 (v5 y))))
这里的问题是一些术语混淆。您的第二个示例y =. i. #
确实是 hook ,并且正在运行as hooks are defined。你的第一个例子i. # x
不是一个钩子,而是一个简单的名词短语,并且也在这样运作名词短语。如果您希望口头等同于i. # x
,请使用foo =: i. @: #
在第二个版本中,正在使用 hook 。 fork 由3个动词组成, hook 由2个动词组成。您的第二个示例i.
和#
中只有2个动词,因此您正在处理的是 hook 。 Hooks 总是调用左动词的二进制效价,无论 hook (一个动词本身)是单调还是二元调用。
如果你想要一个无约束的i.
和#
组合(虽然问自己"为什么?"),那么你必须使用特殊情况&#34 ; capped fork",或伪叉,[: i. #
。这个用例是它的存在理由。
注意:最佳做法是不要重新定义x
或y
或u
或v
;如果必须,请在本地执行此操作,将其基于同名的预先存在的值,并保留名称类,否则您只会混淆每个阅读代码的人。