我正试着用“通用Lisp:符号计算的温柔入门”一书来学习Common。此外,我正在使用SBCL,Emacs,和泥。
在最后一章中,作者给出了在宏上重写内置incf宏的实例.他用两种不同的方法教授这个概念:使用后引号和不使用它。例如:
(defmacro list-notation-my-incf (x)
(list 'setq x (list '+ x 1)))
(defmacro backquote-notation-my-incf (x)
`(setq ,x (+ ,x 1)))稍后,作者介绍了另一个示例:
在下面的示例中,
是一个以函数名和另一个对象作为参数的宏;它用两个参数扩展为对函数的调用,这两个参数都是引用的对象。
他只会用回引角色来做:
(defmacro two-from-one (func object)
`(,func ',object ',object))它如预期的那样工作:
CL-USER> (two-from-one cons stack-overflow)
(STACK-OVERFLOW . STACK-OVERFLOW)使用slime-macroexpad-1,我有:
(CONS 'STACK-OVERFLOW 'STACK-OVERFLOW)作为为自己创建的的一个练习,我试着做同样的事情,但避免使用回引号。不幸的是,我无法使它发挥作用:
(defmacro list-two-from-one (func object)
(list func (quote object) (quote object)))黏液抛出错误:
The variable OBJECT is unbound.
[Condition of type UNBOUND-VARIABLE]做一个宏观扩张,我看到:
(CONS OBJECT OBJECT)如果我尝试一种不同的方法,它似乎更接近,但也不起作用:
(defmacro list-two-from-one (func object)
(list func object object))抛出错误:
The variable STACK-OVERFLOW is unbound.
[Condition of type UNBOUND-VARIABLE]最后,宏观扩展表明:
(CONS STACK-OVERFLOW STACK-OVERFLOW)我觉得卡住了。如何成功地重写宏而不使用反向引号?
谢谢。
发布于 2022-03-30 18:44:56
你要找的东西就像
(defmacro list-two-from-one (func object)
(list func (list 'quote object) (list 'quote object)))基本上,宏的主体应该返回代码,当对代码进行评估时,就会产生所需的结果。
也就是说,宏体应该产生(CONS 'STACK-OVERFLOW 'STACK-OVERFLOW)。
由于'a与(quote a)相同,所以您希望您的宏生成
(CONS (QUOTE STACK-OVERFLOW) (QUOTE STACK-OVERFLOW))这就是我上面的defmacro返回的内容。
发布于 2022-03-30 18:44:18
您的宏应该扩展到:
CL-USER 10 > (macroexpand '(two-from-one2 cons stack-overflow))
(CONS (QUOTE STACK-OVERFLOW) (QUOTE STACK-OVERFLOW))因此,使用这样的quote创建列表:
(defmacro two-from-one2 (func object)
(list func (list 'quote object) (list 'quote object)))测试:
CL-USER 9 > (two-from-one2 cons stack-overflow)
(STACK-OVERFLOW . STACK-OVERFLOW)https://stackoverflow.com/questions/71682294
复制相似问题