首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在宏中扩展宏

在宏中扩展宏
EN

Stack Overflow用户
提问于 2016-04-21 22:29:07
回答 1查看 69关注 0票数 0

我有以下宏:

代码语言:javascript
复制
(defmacro add-children [this children]
  (map (fn [child] (list '.addChild this child)) children))

我想创建以下宏:

代码语言:javascript
复制
(defmacro defgom [name & body]
 (let [sym (gensym)]
  `(let [~sym (Model.)]
     (add-children sym body)))))

考虑到该模型是一个具有addChild函数的Java类。我想把defgom扩展到

代码语言:javascript
复制
(let [*gensym* (Model.)]
  (.addChild *gensym* (first body))
  (.addChild *gensym* (second body))
  ...
  (.addChild *gensym* (last body)))

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

如何正确展开宏内部宏?

PS:我知道我可以用一个函数而不是add-children宏来完成它,但是我想知道是否可以用一个宏来完成它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-21 23:06:22

只需将最后一行改为:

代码语言:javascript
复制
(add-children ~sym ~@body)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36781550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档