2024 Clojure 状态调查中分享您的观点!

欢迎!请查看关于页面了解如何使用本网站的一些更多信息。

0
Clojure

"take-nth" 转换器在每次索引上调用 rem,这相比于一个 zero? 测试相对消耗较多资源。它可以直接从 N 计数 down 作为步长是固定的。

5 个回答

0

评论者:[email protected]

附加的补丁。简单测试(如

(time (transduce (take-nth 13) + (range 1e7)))

0

评论者:[email protected]

我没有考虑 (take-nth 0) 的情况,但我的补丁确实给出了不同的结果。当前实现会得到一个除以零的错误(来自 rem)。我的修改版在第一次只返回第一个元素。常规集合版本会返回一个由第一个元素组成的无限序列。我不认为任何人期望从 0 情况中得到一个合理的答案,所以我没有对它做任何特殊处理。

0

评论者:michaelblume

很酷 =)

我认为转换器版本应该尽可能接近集合版本,但我认为实际上没有一种方法可以编写一个将有限序列转换为无限序列的转换器,所以在这方面运气不佳。

也许在做这项工作时,我们应该同时将转换器和收集的基数修改为抛出零?

0
_评论者:reborg_

GIGO案例中,但rem也负有责任


user=> (take-nth 2.5 (range 10))
(0 3 6 9)
user=> (sequence (take-nth 2.5) (range 10))
(0 5)


Steve(CLJ-1665-faster-take-nth-transducer-without-rem.patch)的补丁仅缺少强转换为int的步骤,以解决上述问题


(defn take-nth [n]
  (fn [rf]
    (let [n (int n)
          iv (volatile! 1)]
      (fn
        ([] (rf))
        ([result] (rf result))
        ([result input]
         (let [i (vswap! iv dec)]
                 (if (zero? i)
                    do (vreset! iv n)
                              (rf result input))
             result)))))))


0
欢迎来到Clojure问答社区,在这里您可以提出问题,并从Clojure社区成员获取答案。
...