この構文を読み取ることができるメタ循環インタープリターの関数 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)))