gpt4 book ai didi

clojure - Clojure 中使用 let/fn 匹配参数

转载 作者:行者123 更新时间:2023-12-02 16:32:22 24 4
gpt4 key购买 nike

这是本书 Programming Clojure (2nd edition) 中的示例代码计算素值。

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

代码具有定义局部函数的结构primes-from在 let 形式中使用它。

(def primes
(concat
[2 3 5 7]
(lazy-seq
(let [primes-from (fn primes-from [n [f & r]] ... ]
(primes-from 11 wheel)))))

但是,我不确定第一个参数11如何第二个参数wheel匹配 [primes-from (fn primes-from [n [f & r]] ... ]结构。

另外,我看不出primes-from是如何定义匿名函数时的参数(fn primes-from [n [f & r]]

关于这段代码有什么解释吗?

最佳答案

let 定义 primes-from 来引用使用 fn 定义的函数。

首次调用 primes-from 时,11 匹配 nwheel 匹配 [f & r]wheel 指的是一个序列,而 [f & r] 需要一个序列——这就是括号的含义。 f(“first”)将匹配序列中的第一个元素,第一次时该元素为 2。 & 表示其后面的参数 r(“rest”)旨在匹配序列的整个其余部分(第一次以 4 开头)。

(cycle 定义了一个惰性序列,因此匹配 r 的内容不会完全展开。)

中的两个“primes-from”(let [primes-from ... 和需要 (fn primes-from ... 中的“primes-from”。第一个实例允许初始调用 primes 定义的最后一行中的函数code>。第二个实例允许在 fn 定义中间按名称递归调用函数。“primes-from”的最后一个实例还为函数提供了一个内部名称属性,该属性在调试过程中可能会有所帮助。

(请注意,fn 定义中有两个递归调用。第一个使用 recur,第二个使用 primes-from。两者都可以使用 primes-from,但如果可能的话,通常最好使用 recur,因为它不使用堆栈,因此效率更高,并且可以避免耗尽内存。recur只能用在尾部位置,即当函数内不需要对返回值进行进一步处理时。不可能在recur中使用第二种情况,因为返回值将被馈送到 conslazy-seq。)

关于clojure - Clojure 中使用 let/fn 匹配参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com