Parsing 调试APL代码:如何使用“@”(索引)和“⊢;”(右大头钉)在一起?

Parsing 调试APL代码:如何使用“@”(索引)和“⊢;”(右大头钉)在一起?,parsing,apl,dyalog,Parsing,Apl,Dyalog,我正试图阅读许亚伦的论文,在那里我找到了一些无法修复的APL代码。我已经附上了一张有问题页面的截图(页面编号74与底部的论文编号一致): 转录代码如下: d ← 0 1 2 3 1 2 3 3 4 1 2 3 4 5 6 5 5 6 3 4 5 6 5 5 6 3 4 这很有意义:创建一个名为d的数组 ⍳≢d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 这也有道理。计算d中的元素数量,并创建一

我正试图阅读许亚伦的论文,在那里我找到了一些无法修复的APL代码。我已经附上了一张有问题页面的截图(页面编号
74
与底部的论文编号一致):

转录代码如下:

d ← 0 1 2 3 1 2 3 3 4 1 2 3 4 5 6 5 5 6 3 4 5 6 5 5 6 3 4
这很有意义:创建一个名为d的数组

⍳≢d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
这也有道理。计算
d
中的元素数量,并创建一个 那么长

⍉↑d,¨⍳≢d
0 1 2 3 1 2 3 3 4  1  2  3  4  5  6  5  5  6  3  4  5  6  5  5  6  3  4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
这有点挑战性,但让我来详细说明一下:

  • 压缩序列
    ⍳≢d=1..27
    ,使用
    d
    数组使用
    惯用语,它使用一个链式将两个数组压缩

  • 然后,使用

现在,大人物:

(⍳≢d)@(d,¨⍳≢d)⊢7 27⍴' '
INDEX ERROR
      (⍳≢d)@(d,¨⍳≢d)⊢7 27⍴' '
试图将其分解:

  • ⍳≢d
    统计
    d
  • (d,)⍳≢d) 
    创建成对数组
    (d,d的索引)
  • 7 27⍴' '
    创建一个
    7x27
    网格:可能是
    7
    ,因为出于索引原因,这是
    d
    +1的最大值
  • 现在我对
    有效:据我所知,它忽略了左边的所有内容!所以我遗漏了一些关于这个表达式的解析
我认为它被解析为:

(⍳≢d)@((d,¨⍳≢d)⊢(7 27⍴' '))
据我所述,应评估为:

(⍳≢d)@((d,¨⍳≢d)⊢(7 27⍴' '))
=  (⍳≢d)@((7 27⍴' ')) [using a⊢b = b]
=  not the right thing

在我写这篇文章的时候,我侥幸修复了这个bug:如果我们将
d
增加为
d+1
,那么我们是1索引的,这个bug就不会再出现了:

d ← d + 1
d
1 2 3 4 2 3 4 4 5 2 3 4 5 6 7 6 6 7 4 5 6 7 6 6 7 4 5
然后:

然而,我还是不明白这是怎么回事!我认为上下文是有用的 对于其他试图离开这篇论文的人,所以我将把它的其余部分留给大家

请解释一下
(⍳≢d) @(d,)⍳≢(d)⊢7 27⍴' '可以!
我附上了原始屏幕截图,以确保我没有错过任何东西:

我很高兴看到你发现了一个错误。它源于Aaron Hsu与0的合作。如果您设置
⎕木卫一←0
则他的代码将起作用


某些二元运算符可以接受数组操作数,给出序列
运算符操作数参数
,例如在
-@(1 2 3)(4 5 6 7)
中。这带来了一个问题,因为操作数和参数都是数组,数组的并置通过一个称为数组的过程将这些数组作为元素形成一个新数组。比较:

(1234)(4567)
┌─────┬───┐
│1 2 3│4 5│
└─────┴───┘
但是,对于带有数组操作数的运算符,我们希望“断开”此串,以便左部分可以用作操作数,而右部分用作参数。打破绞合的一种方法是对参数应用函数,给出序列
运算符操作数函数参数
。现在,我们实际上不需要对参数进行任何转换,因此可以使用:
-@(1 2 3)⊢(4 5 6 7)


至于什么
(⍳≢d) @(d,)⍳≢(d)⊢7 27⍴' '实际上:

7 27⍴' '创建一个空白矩阵

(⍳≢d) 
是要插入矩阵中指定插槽的索引

@(d)⍳≢d) 
表示上述矩阵中的哪些位置应替换现有值


仅用于分隔
(d)⍳≢d) 
from
7 27⍴' '。代码也可以写成
((⍳≢d) @(d,)⍳≢d) )7 27⍴' '
用括号将操作数“绑定”到运算符。

如果我理解正确,这里是
正在使用,这是标识?我也可以使用
?如果是的话,APL是否有一个“中立的”身份操作符?我发现
⊢, ⊣“向一侧倾斜”会让他们因为传送“一元”操作符而分心(
id x=x
)@SiddharthBhat Correct,
正在一元使用,并且
本可以改为使用。有
但它不是具有默认属性的对象的标识,
+
但它不是复数的标识。
,它是一个前缀函数,指向它的(唯一)参数?
(⍳≢d)@(d,¨⍳≢d)⊢7 27⍴' '
1                                                                      
  2     5         10                                                   
    3     6          11                                                
      4     7 8         12                   19                   26   
                9          13                   20                   27
                              14    16 17          21    23 24         
                                 15       18          22       25