dc unix:即使在同一数组索引处存储新值后仍保留初始值

dc unix : preserving initial value even after storing new value at the same array index

我无法理解 dc 联机帮助页中给出的这个示例:

$ dc  
 1 0:a 0Sa 2 0:a La 0;ap  
 1  

对我来说答案应该是 2 因为:

  1. 1 0:a
    这里我们将 1 存储在数组 a.

  2. 的第 0 个位置
  3. 0Sa
    现在我们将 0 压入寄存器 a 的堆栈。

  4. 2 0:a 现在我们再次将 2 存储在数组 a 的第 0 个位置,从而覆盖存储在该位置的前一个 1。

  5. La
    现在我们弹出存储在寄存器 a 堆栈中的 0 并将其压入主堆栈。

  6. 0;a
    现在我们再次将 0 压入主堆栈,然后将其弹出以用作数组索引,因此将存储在数组 a 的第 0 个位置的 2 压入主堆栈。

  7. p
    现在我们打印主堆栈的顶部,即 2。所以答案应该是 2。

我错过了什么?

编辑:

$ dc -V
dc (GNU bc 1.06.95) 1.3.95

手册页中示例前给出的解释:

Note that each stacked instance of a register has its own array associated with it.

换句话说,当你在同一个寄存器上使用数组命令和堆栈命令时,你创建了一个二维结构。数组命令对顶行中的条目进行操作,堆栈命令对整行进行操作。

此外,使用 lL 命令检索的堆栈条目的 "scalar" 值与数组完全分开,而不仅仅是第 0 个元素的别名。 (我没有从手册页中得到它,但在我的实验中似乎是这样。)

以下是示例中的命令,a 的结果值扩展为详细格式。最外层的结构是栈,栈顶在前。

所有寄存器的初始值:

[
  { scalar: undefined, array: [] }
]

1 0:a

[
  { scalar: undefined, array: [1] }
]

0 Sa

[
  { scalar: 0, array: [] },
  { scalar: undefined, array: [1] }
]

2 0:a

[
  { scalar: 0, array: [2] },
  { scalar: undefined, array: [1] }
]

La

[
  { scalar: undefined, array: [1] }
]

(已弹出顶部条目。其标量值 0 已被推入主堆栈,其数组值 [2] 已被丢弃。)

0;a

[
  { scalar: undefined, array: [1] }
]

; 命令不修改寄存器,只是将第 0 个数组条目复制到主堆栈中。由于数组是 [1],这将 1主堆栈的顶部。)