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 中的其他地方是否已解决此问题?
如果允许合并相同的常量值,那么解释器和编译器是否允许不同?(即一个合并而另一个不合并。)
这些主题在有关编译的章节中讨论:CLHS 3.2 编译
两件事情:
a) 允许文件编译器合并相似的文字数据
在文件编译器编译的代码中,两个变量可以指向同一个列表。
另请注意,这对于子列表甚至是可能的。
b) 修改文字数据的效果未定义
意思是:它可以起作用,它不能起作用,它可能有其他可见的影响。例如,编译器可以将文字数据/编译代码放置在受保护的内存中,在绑定修改它时会引发错误。另一个可能的影响可能是共享文字数据被修改(见上文)。
文字数据应被视为不可变,但编译器不需要检测它并发出警告。
这意味着根据 ANSI Common Lisp 标准,对文字数据调用 NREVERSE 不是符合标准的操作。允许 NREVERSE 破坏性地修改其传递的列表,但文字数据应被视为不可变。
注意:不使用文件编译器时
CLHS 3.2.4 编译文件中的文字对象说:本节中描述的文字对象的约束仅适用于编译文件;eval 和compile 不复制或合并常量。。