【发布时间】:2015-07-20 22:12:36
【问题描述】:
我有这个宏,它重写了定义。如果我删除“`”反引号,它将不起作用。有什么解释?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
【问题讨论】:
标签: lisp common-lisp backticks
我有这个宏,它重写了定义。如果我删除“`”反引号,它将不起作用。有什么解释?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
【问题讨论】:
标签: lisp common-lisp backticks
单引号后跟值的书面表示 将产生该值:
示例:
'(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
【讨论】:
&rest 允许您定义具有可变数量参数的函数。假设您要定义一个 plus 函数,其中 (plus 2 3) 和 (plus 2 3 4) 都有效。这个页面有一个很好的解释:gigamonkeys.com/book/functions.html
反引号/反引号会禁用每个子表达式的计算,该子表达式前面没有逗号,用于运算符后面的列表。
来自通用 lisp 食谱,explanation and a few examples。
【讨论】: