反单引号和单引号的区别

在 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)

关键点总结

  • 单引号:完全引用,所有内容都不被求值。
  • 反单引号:部分求值,允许在引用的结构中插入求值的表达式。

解释

  1. 单引号:

    (symbol-value 'package-a:my-symbol) ; 返回 42
    (symbol-value 'package-b:my-symbol) ; 返回 24
    

    这里,单引号引用了符号 package-a:my-symbol​ 和 package-b:my-symbol​,然后 symbol-value​ 函数返回它们的值。

  2. 反单引号:

    (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

这将显示反单引号的部分求值能力。


  • Lisp
    38 引用 • 13 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...