【问题标题】:clojure macro expand repeated codeclojure 宏展开重复代码
【发布时间】:2015-06-29 05:59:40
【问题描述】:

我被困在尝试用 clojure 宏做一些基本的事情。我将示例简化为下面的最小值。假设我有:

(def a {:i 0})

我想将 b 定义为:

(def b (my-func a a a a a a ... a a a a))

在编译时,我知道我想要多少个a(例如 3 个)。但是为了消除代码冗余,为了更好的代码,我想参数化a的数量。我想要类似的东西:

(def b (my-func (some-magic-macro 3 a)))

这将扩展为

(def b (my-func a a a))

用macrodef、repeat、quoting等尝试了一堆东西......由于我现阶段对clojure的理解有限,没有太多成功

谢谢大家!

【问题讨论】:

  • 为什么不直接在some-magic-macro的位置使用repeat呢?也许你想要这个:(def b (apply my-func (repeat 3 a))).
  • ntalbs,我需要的是在编译时进行宏扩展:我需要在我的代码中替换以下内容: (def b (my-func a a a a a ... a a a)) 由 (def b ( my-func (some-magic-macro 3 a))) 将(在编译时)扩展为 (def b (my-func a a a))
  • @ntalbs 实际上,这很有帮助。谢谢!我仍然很困惑如何以及为什么,但这解决了我的问题:)
  • 您可以在文档中查看apply函数。研究(+ 1 2 3 4 5)(apply + [1 2 3 4 5]) 的区别将帮助您理解这一点。

标签: clojure macros


【解决方案1】:

由于宏返回单个表单,您不能让my-magic-macro 返回参数的多个副本以供my-func 使用。但是,您可以将my-func 作为my-magic-macro 的参数包含在内,并返回完整的调用:

(defmacro my-magic-macro [func arg n] `(~func ~@(repeat n arg)))

【讨论】:

  • 啊,我明白了。确实将 my-func 添加为参数使其起作用。感谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2015-01-15
  • 2019-05-21
相关资源
最近更新 更多