Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中的let/fn参数匹配_Clojure_Let - Fatal编程技术网

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)))))