我正在尝试编写一个宏,让我简化一个表达式中多个顶级变量的定义。
这个想法是让它与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
,但似乎根本没有展开。
我做错了什么?我该如何解决?
答案 0 :(得分:5)
dolist
的返回值由其可选的第三个参数给出,因此您的宏返回默认值nil
。
宏只返回一个表单,所以当你有多个东西时,比如你的defparameters
系列,你需要以某种形式包装它们并返回它。 progn
适用于此处。例如:
(defmacro defparameters (exprs)
`(progn ,@(loop for (name exp) in exprs
collect `(defparameter ,name ,exp))))