Common lisp &引用;关于Lisp“的问题:`(a)与';(a b c)vs(列表&"x27;a&"x27;b&"x27;c)

Common lisp &引用;关于Lisp“的问题:`(a)与';(a b c)vs(列表&"x27;a&"x27;b&"x27;c),common-lisp,on-lisp,Common Lisp,On Lisp,在《论Lisp》(第84页)中,格雷厄姆说 ”(abc)(不带逗号)等于”(abc) 然后说 后引号列表相当于调用包含元素的列表 引用。即,(a b c)(不带逗号)等于(列表“a”b“c) 由于(a b c)和(list'a'b'c)似乎不相等,因此必须有一条语句为假。后者是一个新使用的列表(可以安全地修改),而前者是一个常量——或者至少规范允许编译器这样处理它 因此,这可能是一个非常挑剔的问题,但是像(abc)这样的倒引号列表(不带逗号)等于(abc)还是等于(list'abc)?等于和等于

在《论Lisp》(第84页)中,格雷厄姆说

”(abc)
(不带逗号)等于
”(abc)

然后说

后引号列表相当于调用包含元素的列表 引用。
即,
(a b c)
(不带逗号)等于
(列表“a”b“c)

由于
(a b c)
(list'a'b'c)
似乎不相等,因此必须有一条语句为假。后者是一个新使用的列表(可以安全地修改),而前者是一个常量——或者至少规范允许编译器这样处理它


因此,这可能是一个非常挑剔的问题,但是像
(abc)
这样的倒引号列表(不带逗号)等于
(abc)
还是等于
(list'abc)

等于等于不一样


当然
(equal'(abc)(list'a'b'c))
返回
t
,但是,正如您自己正确指出的那样,
(abc)
是一个被引用的常量,而
(list'a'b'c)
是新分配的。

反引号生成的列表允许与模板本身共享结构,因此变异是不安全的。它的实际工作方式取决于实现。啊,好吧,格雷厄姆说它们在关系运算符
equal
方面都是相等的,我把它和等价混淆了。