如何编写将重复命令的宏?
How do I write a macro that will repeat a command?
我正在尝试编写一个宏,让我在一个表达式中简化多个顶级变量的定义。
我们的想法是让它的工作方式类似于 let
的工作方式:
(defparameters ((*foo* 42)
(*bar* 31)
(*baz* 99)))
我尝试使用以下方法,但它似乎没有任何作用。
(defmacro defparameters (exprs)
(dolist (expr exprs)
(let ((name (car expr))
(exp (cadr expr)))
`(defparameter ,name ,exp))))
我尝试过使用 macroexpand
,但它似乎根本无法扩展。
我做错了什么?我该如何解决?
dolist
的 return 值由其可选的第三个参数给出,因此您的宏 return 是 nil
的默认值。
宏只有 return 一种形式,所以当你有多个东西时,比如你的一系列 defparameters
,你需要将它们全部包装成某种形式 return。 progn
适合这里。例如:
(defmacro defparameters (exprs)
`(progn ,@(loop for (name exp) in exprs
collect `(defparameter ,name ,exp))))
我正在尝试编写一个宏,让我在一个表达式中简化多个顶级变量的定义。
我们的想法是让它的工作方式类似于 let
的工作方式:
(defparameters ((*foo* 42)
(*bar* 31)
(*baz* 99)))
我尝试使用以下方法,但它似乎没有任何作用。
(defmacro defparameters (exprs)
(dolist (expr exprs)
(let ((name (car expr))
(exp (cadr expr)))
`(defparameter ,name ,exp))))
我尝试过使用 macroexpand
,但它似乎根本无法扩展。
我做错了什么?我该如何解决?
dolist
的 return 值由其可选的第三个参数给出,因此您的宏 return 是 nil
的默认值。
宏只有 return 一种形式,所以当你有多个东西时,比如你的一系列 defparameters
,你需要将它们全部包装成某种形式 return。 progn
适合这里。例如:
(defmacro defparameters (exprs)
`(progn ,@(loop for (name exp) in exprs
collect `(defparameter ,name ,exp))))