【发布时间】:2013-09-28 15:52:46
【问题描述】:
我需要为可以读取此语法的元循环解释器创建函数 defmacro:
pseudoscheme> (defmacro (minus x y) (list ‘- y x))
MINUS
pseudoscheme> (expand-macro '(minus 3 2))
(- 3 2)
当我使用这个时:
(defmacro my-defmacro ((name &rest args) &body body)
(let ((form (gensym))(env (gensym)))
(progn
`(setf (macro-function ',name)
(lambda (,form ,env))
(destructuring-bind ,args (rest, form) ,@body))
name
)
)
)
然后:
(my-defmacro (min a b)(list '- a b))
我收到此错误:
Error: The variable MIN is unbound.
我不明白为什么。
-----已编辑----- 如果我使用这个:
(defmacro my-defmacro ((name &rest args) &body body)
(let ((form (gensym))(env (gensym)))
`(progn (setf (macro-function ',name)
(lambda (,form ,env))
(destructuring-bind ,args (rest, form) ,@body))
',name)
)
)
然后:
(my-defmacro (min a b)(list '- a b))
我收到此错误:
Error: Odd number of args to SETF: ((MACRO-FUNCTION (QUOTE PLUS)) (LAMBDA (#:G786 #:G787)) (DESTRUCTURING-BIND (A B) (REST #:G786) (LIST # A B)))
【问题讨论】:
-
我们也不行。
PLUS第一次出现在这个问题中是在您的错误消息中。它不会出现在您的代码中任何地方。您没有显示使用您实际使用的代码。此外,您说您希望能够做到(defmacro (minus x y) (list ‘- y x)),但实际上您做到了(my-defmacro (min a b)(- a b))。请按照你说的去做,然后向我们展示结果。 -
这与您的其他问题几乎相同的内容有什么不同redefine defmacro in LISP?
-
不管所有其他事情,你不需要在
let中使用progn,let已经充当隐式progn。 -
@Joshua Taylor,更正了问题,无论如何问题都是一样的。我使用 my-defmacro 只是为了避免重新定义我的 defmacro 函数的请求,但如果我可以使用 defmacro 而不是 my-defmacro 可能会更好。
-
@Sylwester 我已经要求(向版主举报)关闭该问题,因为我犯了一个大错误,我不知道如何让一切更清楚:/
标签: variables lambda common-lisp