LISP中的反引号(backtick)是什么意思?

12

我有一个宏,可以重写“define”。如果我删除反引号“`”,它就不能工作了。这是为什么呢?

(defmacro define ((name &rest r) body) 
  `(defun ,name ,r ,body))
2个回答

23

一个单引号后跟值的书面表示将产生该值:

例如:'(1 x "foo") 将产生一个打印为 (1 x "foo") 的值。

现在假设我不想在列表中使用字面上的符号 x。我程序中有一个变量 x,我想要插入该变量被绑定到的值。

为了标记我想要 x 的值而不是符号 x,我在 x 前面插入一个逗号:

'(1 ,x "foo")

然而,它不能原封不动地工作 - 现在我得到了一个同时具有逗号字面值和符号x的值。问题在于quote不知道逗号约定。

反引号或backquote知道逗号约定,因此将给出正确的结果:

> `(1 ,x "foo")
(1 3 "foo")          ; if the value of x is 3

在这里阅读更多:http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm


好的,我明白了,谢谢。还有一个问题,&rest 前面的 & 运算符是干什么用的? - Alex
3
&rest关键字可以用来定义函数参数数量不定的函数。举个例子,假如你想要定义一个加法函数,使得(plus 2 3)和(plus 2 3 4)都能够正常工作,这个页面有一个很好的解释:http://www.gigamonkeys.com/book/functions.html。 - soegaard
2
我认为值得注意的是,这个特性被称为准引用拟引用 - Frank Tan

7
反引号(backtick/backquote)会禁用运算符后面列表中未在逗号前的每个子表达式的计算。
来自Common Lisp Cookbook,解释和一些示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接