我有这个宏,它重写了define。如果我删除“`”反引号,它将无效。解释是什么?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
答案 0 :(得分:15)
单引号后跟值的书面表示 会产生这个价值:
实施例:
'(1 x" foo")
将生成一个打印为(1 x "foo")
的值。
现在假设我不想在列表中使用文字符号x
。
我的程序中有变量x
,我想插入
x
。
要标记我想要x
的值而不是符号x
,
我在x
之前插入逗号:
'(1 ,x "foo")
虽然它不会按原样运行 - 我现在得到一个带有文字逗号和符号x
的值。问题是quote
不知道逗号约定。
Backtick或backquote
知道逗号约定,这将得到正确的结果:
> `(1 ,x "foo")
(1 3 "foo") ; if the value of x is 3
在此处阅读更多内容:http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm
答案 1 :(得分:6)
反引号/反引号禁用对运算符后面的列表前面没有逗号的每个子表达式的评估。
来自普通的lisp食谱,explanation and a few examples。