"On Lisp": `(a b c) vs '(a b c) vs (list 'a 'b 'c)
"On Lisp": `(a b c) vs '(a b c) vs (list 'a 'b 'c)
在 On Lisp(第 84 页)Graham 说
‘(a b c)
(without comma) is equal to ’(a b c)
然后说
A backquoted list is equivalent to a call to list with the elements
quoted.
That is, ‘(a b c)
(without comma) is equal to (list ’a ’b ’c)
.
一个陈述必须是错误的,因为 '(a b c)
和 (list 'a 'b 'c)
似乎不相等。后者是一个新的 consed 列表(可以安全修改),而前者是一个常量——或者至少规范允许编译器这样对待它。
所以这可能是一个非常挑剔的问题,但它是一个反引号列表(没有逗号),例如 ‘(a b c)
等于 '(a b c)
或等于 (list 'a 'b 'c)
?
等于和等价不一样。
当然 (equal '(a b c) (list 'a 'b 'c))
returns t
,但是,正如您自己正确指出的那样,'(a b c)
是引用常量,而 (list 'a 'b 'c)
是新分配的。
在 On Lisp(第 84 页)Graham 说
‘(a b c)
(without comma) is equal to’(a b c)
然后说
A backquoted list is equivalent to a call to list with the elements quoted.
That is,‘(a b c)
(without comma) is equal to(list ’a ’b ’c)
.
一个陈述必须是错误的,因为 '(a b c)
和 (list 'a 'b 'c)
似乎不相等。后者是一个新的 consed 列表(可以安全修改),而前者是一个常量——或者至少规范允许编译器这样对待它。
所以这可能是一个非常挑剔的问题,但它是一个反引号列表(没有逗号),例如 ‘(a b c)
等于 '(a b c)
或等于 (list 'a 'b 'c)
?
等于和等价不一样。
当然 (equal '(a b c) (list 'a 'b 'c))
returns t
,但是,正如您自己正确指出的那样,'(a b c)
是引用常量,而 (list 'a 'b 'c)
是新分配的。