Jay*_*don 3 recursion tail-recursion clojure lazy-sequences
我随机阅读了Clojure源代码,我看到分区函数是在递归方面定义的,不使用"recur":
(defn partition
... ...
([n step coll]
(lazy-seq
(when-let [s (seq coll)]
(let [p (doall (take n s))]
(when (= n (count p))
(cons p (partition n step (nthrest s step))))))))
... ...)
Run Code Online (Sandbox Code Playgroud)
这样做有什么理由吗?
分区是懒惰的.递归调用partition发生在一个体内lazy-seq.因此,它不会立即被调用,而是在需要时进行评估的特殊seq-able对象中返回,并缓存到目前为止实现的结果.堆栈深度限制为一次一次调用.
没有lazy-seq的recur可以用来创建一个渴望版本,但你不希望在不确定长度的序列上使用它,就像你在核心版本中一样.