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

时间:2018-03-06 16:39:41

标签: lisp common-lisp semantics

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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'