Common Lisp中反引号和引号符号的语义差异是什么?

4
我了解backtick(`)和apostrophe(')都可以阻止符号或表达式的求值。但是,在宏定义中使用反引号,而在符号(等等其他内容)中使用撇号。从语义上讲,这两种表示法有什么区别呢?
2个回答

6

反引号允许将动态部分插入引用表达式中,如,foo,@foo

' 直接按字面意思引用所有内容。

如果表达式中没有逗号部分,则可以交替使用 `'


啊,这样就说得通了。谢谢。 - Shoblade X

5

标准的引用是一个真正的常量字面量,类似的列表和以相同结构结尾的列表可以共享值:

'(a b c d) ; ==> (a b c d)

一个反引号结构可能不是字面量。它会被认为是需要评估和插入到指定位置的每个未引用元素的总和。这意味着类似于`(a ,@b ,c d)这样的东西实际上会被扩展成类似于(cons 'a (append b (cons c '(d))))的东西。
标准在解决这个问题时非常灵活,因此如果您尝试macroexpand表达式,则会得到许多不同的解决方案和有时是内部函数。然而,标准中对结果进行了很好的解释
注:即使两个单独的评估产生不同的值,实现仍然可以自由共享结构,因此在我的示例中,'(d) 有潜力被共享,并且如果使用结果的突变连接可能会得到无限结构。
类似的,一些Algol语言中也有两种类型的字符串,一种是插入变量的,另一种则不会。例如在PHP中。
"Hello $var"; // ==> 'Hello Shoblade'
'Hello $var'; // ==> 'Hello $var'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接