Sho*_*e X 4 lisp common-lisp semantics
我理解这两者都抑制了符号或表达式的评估.但是反引号用于宏定义,而撇号用于符号(除其他外).从语义上讲,这两种符号之间有什么区别?
标准引用是一个真正的常量文字和类似的列表和列表,结尾具有相同的结构可以共享值:
'(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)