这个 APL 代码有什么作用?

What does this APL code do?

我正在努力学习 APL。以下代码片段来自 http://archive.vector.org.uk/art10011550,其中声明此代码就像用英语阅读 'MUMMY' 一样简单!

R←((V⍳V)=⍳⍴V)/V

我尝试从 https://en.wikipedia.org/wiki/APL_syntax_and_symbols 进行检查,我发现

R is outcome variable
← means gets a value
⍴ means number of components in each dimension of V
⍳ means vector of initial elements

因此,此代码处理输入变量 V 并生成输出变量 R。但是,我无法弄清楚这段代码的确切含​​义或作用是什么?有人可以在这里解释一下吗?谢谢

该代码等效于 R←∪V - 获取唯一元素,仅保留向量中每个项目的第一个。

V⍳V 为向量 V 中的每个元素获取该项目在同一向量中的第一个索引。因此,对于第一次出现的元素,它将等于它在向量中的索引。对于 V←1 2 2 4 2 5,结果是 1 2 2 4 2 6

⍳⍴V returns 数字范围 1..length(V)。对于与上面相同的 V,结果是 1 2 3 4 5 6.

并且 = 检查两者之间的逐元素相等性 - 它会为每个元素查找它之前是否出现在向量中。对于我的示例,此 returns 1 1 0 1 0 1.

然后/V过滤初始向量,只留下上面向量中有1对应的项目。结果为 1 2 4 5.

我将该表达式读为 Items of the vector V where the first appearance of the item equals it's index

Try it online!

miserver.dyalog.com/Examples/Applications/Idiom_Search 上搜索 ((V⍳V)=⍳⍴V)/V 将为您提供:独一无二。从向量中删除重复项。 尽管您可能并不总是 幸运,因为变量名称可能不同。您也可以尝试在那里搜索没有名称的重要部分,例如)=⍳⍴ 在这种情况下。

该文章的作者写了很多扩展版本,即优秀的书Mastering Dyalog APL。我强烈推荐它。