我有一个宏,可以重写“define”。如果我删除反引号“`”,它就不能工作了。这是为什么呢?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
我有一个宏,可以重写“define”。如果我删除反引号“`”,它就不能工作了。这是为什么呢?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
一个单引号后跟值的书面表示将产生该值:
例如:'(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
关键字可以用来定义函数参数数量不定的函数。举个例子,假如你想要定义一个加法函数,使得(plus 2 3)和(plus 2 3 4)都能够正常工作,这个页面有一个很好的解释:http://www.gigamonkeys.com/book/functions.html。 - soegaard