Clojure中惰性素数生成器函数内的绑定

Clojure中惰性素数生成器函数内的绑定,clojure,lazy-evaluation,primes,seq,Clojure,Lazy Evaluation,Primes,Seq,我实现了一个惰性素数生成器(NextTime返回从传递的数字开始的下一个素数): 假设NextTime是一个代价高昂的函数,为了不执行两次,我尝试将其绑定到一个符号: (defn allprimes ([] (allprimes 2)) ([x] (let [next (nextprime x)] (cons next (lazy-seq (allprimes (next))))))) 但这不起作用(java.lang.Long不能转换为clojure.lang

我实现了一个惰性素数生成器(NextTime返回从传递的数字开始的下一个素数):

假设NextTime是一个代价高昂的函数,为了不执行两次,我尝试将其绑定到一个符号:

(defn allprimes
    ([] (allprimes 2))
    ([x] (let [next (nextprime x)]
        (cons next (lazy-seq (allprimes (next)))))))
但这不起作用(java.lang.Long不能转换为clojure.lang.IFn)。为什么?

另外,(cons n(lazy seq…)和(lazy seq(cons n…)之间有什么区别吗?)


编辑:感谢凯尔指出第一个问题中的错误。如果将括号从next中删除,它将起作用。

您在
(next)
周围有额外的括号:
next
然后作为函数
IFn
调用,尽管
next
是一个
长的

对于第二个问题,中的las示例详细介绍了两种解决方案之间的差异


大约
(cons n(lazy seq…)
将始终计算
n
,即使它没有被消耗,并且
(lazy seq(cons n…)
是完全懒惰的。如果
n
不仅仅是一个数字,而是一些可能需要大量计算的函数,这可能很重要。

下一个
处于函数位置。尝试删除参数-
(下一步为所有素数)
谢谢,第一个问题已结束。。。我觉得自己好笨!另请看一下
iterate
,它为您构造了一个惰性seq-
(def allprimes(iterate nextprime 2))
它应该是
(cons x(allprimes(nextprime x))
无论如何,不需要
let
(defn allprimes
    ([] (allprimes 2))
    ([x] (let [next (nextprime x)]
        (cons next (lazy-seq (allprimes (next)))))))