【问题标题】:How do I write a macro that will repeat a command?如何编写将重复命令的宏?
【发布时间】:2015-04-11 22:10:23
【问题描述】:

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

我们的想法是让它的工作方式类似于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,但它似乎根本没有扩展。

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

【问题讨论】:

    标签: macros common-lisp


    【解决方案1】:

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

    宏只返回一种形式,因此当您有多个东西时,例如您的defparameters 系列,您需要将它们全部包装成某种形式并返回。 progn 适合这里。例如:

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

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2020-07-16
      • 2013-12-25
      • 2010-10-10
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多