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

问题描述 投票:4回答:2

我理解这两者都抑制了符号或表达式的评估。但是反引号用于宏定义,而撇号用于符号(除其他外)。从语义上讲,这两种符号之间有什么区别?

lisp common-lisp semantics
2个回答
5
投票

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

'直接引用一切字面意思。

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


5
投票

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

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

反引号结构可能不是文字。对其进行评估,因为每个非引用都需要进行评估并插入到位。这意味着像`(a ,@b ,c d)这样的东西实际上扩展到类似于(cons 'a (append b (cons c '(d))))的东西。

标准对于实现如何解决这个问题非常灵活,所以如果你尝试使用macroexpand表达式,你会获得许多不同的解决方案,有时还会有内部函数。结果虽然is well explained in the standard

注意:尽管两个单独的评估产生不同的值,但实现仍然可以自由共享结构,因此在我的示例中'(d)有可能被共享,如果使用变量连接结果可能最终会产生无限结构。

与此平行的是,在某些algol语言中,您有两种类型的字符串。一个插入变量,一个不插入变量。例如。用PHP

"Hello $var"; // ==> 'Hello Shoblade'
'Hello $var'; // ==> 'Hello $var'
© www.soinside.com 2019 - 2024. All rights reserved.