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

Macros 如何编写将重复命令的宏?,macros,common-lisp,Macros,Common Lisp,我正在尝试编写一个宏,使我能够在一个表达式中简化多个顶级变量的定义 其想法是使其工作方式类似于let的工作方式: (defparameters ((*foo* 42) (*bar* 31) (*baz* 99))) 我试着使用下面的方法,但似乎没有任何效果 (defmacro defparameters (exprs) (dolist (expr exprs) (let ((name (car expr))

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

其想法是使其工作方式类似于
let
的工作方式:

(defparameters ((*foo* 42)
                (*bar* 31)
                (*baz* 99)))
我试着使用下面的方法,但似乎没有任何效果

(defmacro defparameters (exprs)
  (dolist (expr exprs)
    (let ((name (car  expr))
          (exp  (cadr expr)))
      `(defparameter ,name ,exp))))
我尝试过使用
宏扩展
,但它似乎根本没有扩展


我做错了什么?如何修复它?

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

宏只返回一种形式,因此当您有多个内容时,例如一系列
defparameters
,您需要以某种形式将它们全部打包并返回<代码>程序适用于此处。例如:

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

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

宏只返回一种形式,因此当您有多个内容时,例如一系列
defparameters
,您需要以某种形式将它们全部打包并返回<代码>程序适用于此处。例如:

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