相关疑难解决方法(0)

Clojure地图功能的高效副作用模拟

如果mapdoseq生了一个孩子?我正在尝试编写像Common Lisp这样的函数或宏mapc,但是在Clojure中.这基本上做了什么map,但用于副作用,因此它不需要生成一系列结果,也不会是懒惰的.我知道可以使用迭代迭代单个序列doseq,但map可以迭代多个序列,将函数应用于所有序列的每个元素.我也知道,一个可以包装mapdorun.(注意:经过许多评论和非常彻底的回答后,这个问题已被广泛编辑.原始问题集中在宏,但那些宏观问题被证明是外围的.)

这很快(根据标准):

(defn domap2
  [f coll]
  (dotimes [i (count coll)]
    (f (nth coll i))))
Run Code Online (Sandbox Code Playgroud)

但它只接受一个集合.这接受任意集合:

(defn domap3
  [f & colls]
  (dotimes [i (apply min (map count colls))]
    (apply f (map #(nth % i) colls))))
Run Code Online (Sandbox Code Playgroud)

但相比之下,这是非常缓慢的.我也可以写这样的一个第一版本,但使用不同的参数情况[f c1 c2],[f c1 c2 c3]等等,但最终,我需要一个处理藏品的任意数字,像最后一个例子,这是无论如何简单的情况下.我也尝试了很多其他解决方案.

由于第二个例子非常像第一个例子,除了使用applymap循环内部之外,我怀疑摆脱它们会加速很多事情.我试图通过将domap2编写为宏来实现这一点,但是&处理后的catch-all变量的方式让我一直绊倒,如上所示.

其他的例子(满分为15个或20个不同的版本),基准代码和时间在MacBook Pro上,这是一个几十岁(完整源在这里):

(defn domap1
  [f coll]
  (doseq [e coll] 
    (f …
Run Code Online (Sandbox Code Playgroud)

clojure

3
推荐指数
1
解决办法
530
查看次数

标签 统计

clojure ×1