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

Sho*_*e X 4 lisp common-lisp semantics

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

mel*_*ene 5

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

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

如果在表达无逗点的部分,`并且'可以互换使用.


Syl*_*ter 5

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

'(a b c d) ; ==> (a b c d)
Run Code Online (Sandbox Code Playgroud)

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

该标准对于实现如何解决这个问题非常灵活,因此如果您尝试macroexpand使用表达式,您将获得许多不同的解决方案,有时还会获得内部函数.结果虽然在标准中得到了很好的解释.

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

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

"Hello $var"; // ==> 'Hello Shoblade'
'Hello $var'; // ==> 'Hello $var'
Run Code Online (Sandbox Code Playgroud)