【问题标题】:"On Lisp": `(a b c) vs '(a b c) vs (list 'a 'b 'c)“在 Lisp 上”:`(a b c) vs '(a b c) vs (list 'a 'b 'c)
【发布时间】:2023-11-25 00:28:02
【问题描述】:

On Lisp 中(第 84 页)格雷厄姆说

‘(a b c)(不带逗号)等于’(a b c)

然后说

反引号列表等效于使用元素调用列表
‘(a b c)(不带逗号)等于(list ’a ’b ’c)

因为'(a b c)(list 'a 'b 'c) 似乎不相等,所以一个陈述必须是错误的。后者是一个新的 consed 列表(可以安全修改),而前者是一个常量——或者至少规范允许编译器这样对待它。

所以也许这是一个非常挑剔的问题,但它是一个反引号列表(不带逗号),例如 ‘(a b c) 等于 '(a b c) 或等于 (list 'a 'b 'c)

【问题讨论】:

  • 允许反引号产生的列表与模板本身共享结构,因此变异是不安全的。它的实际工作方式取决于实现。

标签: common-lisp on-lisp


【解决方案1】:

相等等价是不一样的。

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

【讨论】:

  • 啊,好的,所以 Graham 说它们在关系运算符 equal 方面都是相等的,我将其与等价混淆了。