Common Lisp:解释器或编译器是否允许合并相同的常量表达式?

Rob*_*ier 0 common-lisp constant-expression

我正在阅读 CLHS 中 DEFVAR 的描述(http://clhs.lisp.se/Body/m_defpar.htm)。我正在尝试确定什么是符合以下行为的行为

(defvar x '(1 2 3))
(defvar y '(1 2 3))
(nreverse x)
Run Code Online (Sandbox Code Playgroud)

也可以反转 Y 吗?如果解释器或编译器将 X 和 Y 的值识别为相同并且只创建一个实例来引用它们,那么这就是预期的情况。我想知道 CLHS 是否允许这种常量折叠。

我读了 DEFVAR 的 CLHS,但无法弄清楚;我没有看到那里讨论了该主题。CLHS 中的其他地方是否已解决此问题?

如果允许合并相同的常量值,那么解释器和编译器是否允许不同?(即一个合并而另一个不合并。)

Rai*_*wig 5

这些主题在有关编译的章节中讨论:CLHS 3.2 编译

两件事情:

a) 允许文件编译器合并相似的文字数据

请参阅:CLHS 3.2.4.4 对可外部化对象的附加约束

在文件编译器编译的代码中,两个变量可以指向同一个列表。

另请注意,这对于子列表甚至是可能的。

b) 修改文字数据的效果未定义

意思是:它可以起作用,它不能起作用,它可能有其他可见的影响。例如,编译器可以将文字数据/编译代码放置在受保护的内存中,在绑定修改它时会引发错误。另一个可能的影响可能是共享文字数据被修改(见上文)。

文字数据应被视为不可变,但编译器不需要检测它并发出警告。

这意味着根据 ANSI Common Lisp 标准,对文字数据调用 NREVERSE 不是符合标准的操作。允许 NREVERSE 破坏性地修改其传递的列表,但文字数据应被视为不可变。

请参阅:CLHS 3.7.1 文字对象的修改

注意:不使用文件编译器时

CLHS 3.2.4 编译文件中的文字对象说:本节中描述的文字对象的约束仅适用于编译文件;eval 和compile 不复制或合并常量。。