在J中组成动词的奇怪结果

时间:2013-10-05 03:33:07

标签: j

我想知道为什么以下无效。

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

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

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

J字典中的自引用说明' $:表示包含它的最长动词。' http://www.jsoftware.com/help/dictionary/d212.htm

结合     ({&('no';'yes'))原始动词     

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

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

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

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