我想知道为什么以下无效。
(1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4))7
1
和
(({&('no';'yes'))@(1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4)))7
┌──┐
│no│
└──┘
我希望它返回yes
,因为它接受第二个参数(因为第一个表达式的计算结果为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│ └───┘