1

当我尝试在 Dyalog APL 中分配名称时,我收到以下错误消息之一:

  • SYNTAX ERROR: Can't change nameclass on assignment
  • SYNTAX ERROR: Invalid modified assignment, or an attempt was made to change nameclass on assignment

“在分配时更改名称类”到底是什么意思,为什么不允许,我该如何解决这个问题?

4

1 回答 1

4

“在分配时更改名称类别”到底是什么意思?

APL 区分句法角色,每个角色由一个数字标识。该⎕NC函数接受一个或多个名称,并返回它们的Name Class,例如 2 代表变量,3 代表函数,4 代表运算符,9 代表 ref。

根据作业文件

重新分配

如果分配不会更改其名称类,或者将其从 2 更改为 9,反之亦然,则可以为已存在的名称分配新值。允许重新分配表如下:

参考 多变的 功能 操作员
参考 是的 是的
多变的 是的 是的
功能 是的 是的
操作员 是的 是的

为什么不允许?

当执行扩充赋值使用赋值的值时(赋值箭头右侧的任何内容都作为结果返回),必须禁止某些重新赋值以消除歧义。例如:

      Plus←+
      a←100
      a Plus←10
      a
110
      Double←{2×⍵}
      Double b←10
20

如果没有这个限制,就不可能将这些情况与并行分配区分开来:

      c d←10
      c
10
      d
10

我该如何解决这个问题?

在生产代码中为完全不同的东西重用名称可能是个坏主意,建议采用严格的命名约定(例如mine)。但是,在交互式会话 (REPL) 中进行试验时,只需删除现有名称的定义,即可将其用于所有用途。(⎕EX删除)系统函数和)ERASE系统命令都这样做:

      a←10
      a←+
SYNTAX ERROR: Can't change nameclass on assignment
      a←+
       ∧
      ⎕EX'a'
      a←+
      a←10
SYNTAX ERROR: Invalid modified assignment, or an attempt was made to change nameclass on assignment
      a←10
      ∧
      )erase a
      a←10
于 2021-10-09T20:37:47.427 回答