在 Common Lisp 中,单引号('
)和反单引号(```)用于不同的目的,主要用于处理数据的引用。以下是它们的主要区别:
单引号('
)
- 作用:用于引用一个表达式,使其不被求值。
- 示例:如果你写
'(+ 1 2)
,这个表达式将返回(+ 1 2)
,而不是计算结果3
。
(setq x '(1 2 3)) ; x 现在是一个列表 (1 2 3)
反单引号(```)
- 作用:用于创建一个模板,允许在其中进行部分求值。它可以与逗号(
,
)结合使用,以便在引用的结构中插入求值的内容。 - 示例:如果你写 ``(1 2 ,(+ 1 2))
,这个表达式将返回
(1 2 3),因为
(+ 1 2)` 会被求值。
(setq y `(1 2 ,(+ 1 2)) ) ; y 现在是 (1 2 3)
关键点总结
- 单引号:完全引用,所有内容都不被求值。
- 反单引号:部分求值,允许在引用的结构中插入求值的表达式。
解释
-
单引号:
(symbol-value 'package-a:my-symbol) ; 返回 42 (symbol-value 'package-b:my-symbol) ; 返回 24
这里,单引号引用了符号
package-a:my-symbol
和package-b:my-symbol
,然后symbol-value
函数返回它们的值。 -
反单引号:
(symbol-value `package-a:my-symbol) ; 返回 42
在这个例子中,反单引号 ``` 仍然将
package-a:my-symbol
视为符号,而不是计算它。反单引号在这里没有实际求值效果,因为它没有包含任何可以被求值的表达式。
关键点
- 在反单引号的上下文中,如果没有使用逗号
,
来插入求值的内容,结果与单引号相同。 - 因此,``package-a:my-symbol
和
'package-a:my-symbol` 这两者在这种情况下的效果一致,都是引用符号。
示例
如果你想在反单引号中插入一个求值的表达式,可以这样做:
(setq my-symbol 'package-a:my-symbol)
(symbol-value `(,(symbol-value my-symbol)) ) ; 返回 42
这将显示反单引号的部分求值能力。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于