自从我继续我的一位同事的项目以来,过去一周我一直在使用Clojure。我们正在使用Clojure生成一些文件。我正在尝试重构一些代码,因为他必须快速完成并硬编码大部分值。所以我有:
(defn gen [a b] (...))
我希望用
之类的内容包装它(defn gen-vector [a-vec b-vec] (...))
gen_vector
将成为我的“主要”,这意味着我将通过编写类似
(gen-vector [1 2] [3 4])
我希望得到gen
的所有组合,比如执行:
(gen 1 3)
(gen 1 4)
(gen 2 3)
(gen 2 4)
到目前为止我所拥有的是
(map #(gen %1 %2) countries fieldchar)
但是,这并没有做到这一点,因为它只做1-3,2-4。关于如何实现这个的任何想法?
此致 低糜
答案 0 :(得分:5)
要获得(gen x y)
的延迟值,请使用
(for [x x-vec
y y-vec]
(gen x y))
如果gen
是一个没有有用返回值的副作用调用函数,那么您需要将for
替换为doseq
。
for
和doseq
的基本形式 1 为输入序列的笛卡尔乘积中的每个元组计算它们的实体。相反,(map f xs ys ...)
以锁步方式遍历序列,因此只使用序列中匹配位置的元素元组。
1 还有一种用于过滤(:when
)的迷你语言,提前停止循环(:while
)并引入本地绑定(:let
)在绑定向量内。有关语法的概述,请参阅(doc for)
,有关:when
和:while
的示例,请参阅this recent answer of mine。