【发布时间】: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])的区别将帮助您理解这一点。