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