Clojure中的let/fn参数匹配
这是本书中计算素数值的示例代码Clojure中的let/fn参数匹配,clojure,let,Clojure,Let,这是本书中计算素数值的示例代码 (def primes (concat [2 3 5 7] (lazy-seq (let [primes-from (fn primes-from [n [f & r]] (if (some #(zero? (rem n %)) (take-while #(<= (* % %) n) primes)) (recu
(def primes
(concat
[2 3 5 7]
(lazy-seq
(let [primes-from
(fn primes-from [n [f & r]]
(if (some #(zero? (rem n %))
(take-while #(<= (* % %) n) primes))
(recur (+ n f) r)
(lazy-seq (cons n (primes-from (+ n f) r)))))
wheel (cycle [2 4 2 4 6 2 6 4 2 4 6 6 2 6 4 2
6 4 6 8 4 2 4 2 4 8 6 4 6 2 4 6
2 6 6 4 2 4 6 2 6 4 2 4 2 10 2 10])]
(primes-from 11 wheel)))))
但是,我不确定第一个参数11
和第二个参数wheel
如何与[primes from(fn primes from[n[f&r]]…]结构匹配
另外,在定义匿名函数(fn primes from[n[f&r]]
时,我看不到如何从参数初始化
有关于此代码的任何解释吗?让定义从中素数,以引用使用fn
定义的函数
当第一次调用primesfrom
时,11个匹配n
,而wheel
匹配[f&r]
wheel
指的是一个序列,而[f&r]
期望的是一个序列——这就是括号中的意思。f
(“第一”)将匹配序列中的第一个元素,第一次到第二次为2。&
表示它后面的参数r
(“rest”)旨在匹配序列的整个其余部分(第一次到第四次为4)
(cycle
定义了一个惰性序列,因此匹配的r
没有完全展开。)
中的“primes from”(让[primes from…
和
“代码中的素数”(FN-Primes从…./CODE)是需要的。第一个实例是允许在“代码> Primes < /Cord>”的最后一行中对函数的初始调用。第二个实例是允许在“代码”> FN< /COD>定义的中间以名称递归调用函数。“primesfrom”还为函数提供了一个内部名称属性,该属性在调试期间可能会有所帮助
(请注意,fn
定义中有两个递归调用。第一个使用recur
,第二个使用primes from
。两者都可以使用primes from
,但通常最好在可能的情况下使用recur
,因为它不使用堆栈,因此效率更高,并且避免运行)g内存不足。recur
只能在尾部位置使用,即不需要对函数中的返回值进行进一步处理时。在第二种情况下,不可能使用recur
,因为返回值将被馈送到cons
和惰性seq
)
(def primes
(concat
[2 3 5 7]
(lazy-seq
(let [primes-from (fn primes-from [n [f & r]] ... ]
(primes-from 11 wheel)))))