J的#操作员:为什么不逆转?

时间:2014-05-09 20:23:00

标签: language-design j apl

过去几周我一直在研究J,而且真正让我烦恼的是#运算符的二元情况:我使用它的唯一方法是类似于以下内容:

(1 p: a) # a

如果相反,可以省略括号:

a #~ 1 p: a

为什么选择不反对当前的论点?向后熟悉APL,或者我完全忽视的东西?

1 个答案:

答案 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