过去几周我一直在研究J,而且真正让我烦恼的是#
运算符的二元情况:我使用它的唯一方法是类似于以下内容:
(1 p: a) # a
如果相反,可以省略括号:
a #~ 1 p: a
为什么选择不反对当前的论点?向后熟悉APL,或者我完全忽视的东西?
答案 0 :(得分:6)
一般来说,J的基元设计为在右侧采用“主要数据”,在左侧采用“控制数据”。
“主要”和“控制”数据之间的区别并不明显,但总的来说,人们会期望“主要”数据比“控制”数据更频繁地变化。也就是说,可以预期“控制”数据的计算可能性不如“主要”数据。
设计选择的原因正如您所指出的那样:因为如果更可能计算的数据(与高级固定相反)出现在右侧,那么更多的J短语可以表示为简单的列车或者动词的管道,没有过多的括号(假设J从左到右执行)。
现在,在#
的情况下,哪些数据更有可能被计算出来?你是100%正确的,很可能计算过滤器(或掩码)。但是,要过滤的数据几乎肯定 要计算。例如,你在哪里获得了a
?
QED。
PS:如果您的a
可以通过某个J动词计算,如a=: ...
中所示,那么您的整个结果,过滤器和所有结果都可以用primeAs =: 1&p: # ...
表示。
PPS:注意那里的1&p:
。这是“控制”与“主要”的另一个例子:1
是控制数据 - 你可以告诉它,因为它永远与p:
绑定 - 而且它是固定的。因此,非巧合的是,p:
旨在将其作为左参数。
PPPS:“控制数据出现在左侧”这一概念已经以多种不同的方式表达出来。你可以在这里找到一个经验丰富的Jers解释:http://www.jsoftware.com/pipermail/general/2007-May/030079.html。