如何编写一个宏,将重复的命令?(How do I write a macro that will r

2019-10-22 15:06发布

我想编写一个宏,将让我简化多个顶级变量的定义在一个单一的表达。

当时的想法是,使工作类似于如何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但它似乎并没有在所有扩大。

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

Answer 1:

一个的返回值dolist通过其可选的第三个参数给出,所以你的宏返回的默认nil

宏只返回一个形式,所以当你有多个的东西,比如你的系列defparameters ,你需要用他们都以某种形式和返回。 progn将是适合在这里。 例如:

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


文章来源: How do I write a macro that will repeat a command?