Hook在文字短语中工作,但在分配给变量时不起作用

时间:2016-11-18 05:21:50

标签: j

考虑:

  x=.4 5 6 7
  i.# x
0 1 2 3

这是预期的。钩子#作用于参数(列表4 5 6 7),返回其长度4,然后传递给i.,数字0到3是打印。

但是,如果我首先将动词短语分配给变量,然后然后将它应用于同一个列表,我会得到一个不同的答案:

   y=.i.#
   y x
0

为什么?

1 个答案:

答案 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. #。这个用例是它的存在理由。

注意:最佳做法是不要重新定义xyuv;如果必须,请在本地执行此操作,将其基于同名的预先存在的值,并保留名称类,否则您只会混淆每个阅读代码的人。

鸣谢:EelvexDan Bron的评论已通过将其粘贴在上面并进行了大量编辑而得到了回答。