如何编写将重复命令的宏?

时间:2015-04-11 22:10:24

标签: macros common-lisp

我正在尝试编写一个宏,让我简化一个表达式中多个顶级变量的定义。

这个想法是让它与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,但似乎根本没有展开。

我做错了什么?我该如何解决?

1 个答案:

答案 0 :(得分:5)

dolist的返回值由其可选的第三个参数给出,因此您的宏返回默认值nil

宏只返回一个表单,所以当你有多个东西时,比如你的defparameters系列,你需要以某种形式包装它们并返回它。 progn适用于此处。例如:

(defmacro defparameters (exprs)
  `(progn ,@(loop for (name exp) in exprs
                  collect `(defparameter ,name ,exp))))