1

我想知道为什么以下方法不起作用。

   (1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4))7
1

   (({&('no';'yes'))@(1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4)))7
┌──┐
│no│
└──┘

我希望它返回yes,因为它采用第二个参数(因为第一个表达式的计算结果为1)。有人可以解释一下吗?

谢谢。

4

1 回答 1

3

我必须承认很难弄清楚你想要做什么,但我认为问题是你使用自我参考($ :)。

J 词典中对自指的描述说“$: 表示包含它的最长动词”。 http://www.jsoftware.com/help/dictionary/d212.htm

通过 ({&('no';'yes'))与您的原始动词 结合

(1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4))

您实际上已经更改了 $: self 引用的动词,我相信这会导致(意外)行为。我希望这个对你有用。如果你能给出使用 $: 的理由,我可能会更好地回答你的动词为什么会这样工作。我倾向于很少使用它,因为 J 中通常有更好的解决方案。

只是另一个想法。您可以单独定义要创建的动词部分,这将限制 $: 的范围并为您提供所需的行为。

   选择=: (1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4))
   显示=:({&('否';'是'))
   显示@选择7
┌────┐
│是的│
└────┘</pre>
于 2013-10-05T07:06:08.473 回答