【问题标题】:Expanding macros in macros在宏中扩展宏
【发布时间】:2016-04-21 22:29:07
【问题描述】:

我有以下宏:

(defmacro add-children [this children]
  (map (fn [child] (list '.addChild this child)) children))

我想创建以下宏:

(defmacro defgom [name & body]
 (let [sym (gensym)]
  `(let [~sym (Model.)]
     (add-children sym body)))))

考虑到 Model 是一个带有 addChild 函数的 Java 类。我想将defgom 扩展为

(let [*gensym* (Model.)]
  (.addChild *gensym* (first body))
  (.addChild *gensym* (second body))
  ...
  (.addChild *gensym* (last body)))

在评估时,add-children 宏会给出正确的结果(.addChild 的列表)。但我无法在 defgom 宏中对其进行评估。我收到“不知道如何从:clojure.lang.Symbol 创建 ISeq”。我尝试使用~~@(假设add-children 返回一个列表),但没有一个奏效。

如何在宏里面正确展开宏?

PS:我知道我可以使用函数而不是 add-children 宏来做到这一点,但我想知道是否可以使用宏来做到这一点。

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    只需将最后一行更改为:

    (add-children ~sym ~@body)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多