gpt4 book ai didi

recursion - 在 Clojure 中实现 foreach (doseq)

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:53 24 4
gpt4 key购买 nike

我正在通过 SICP 进行工作 - 一项练习是实现 foreach (doseq)。 这是一个学术练习。在 Clojure 中,这是我想出的:

(defn for-each [proc, items]
(if (empty? items) nil
(do
(proc (first items))
(recur proc (rest items)))))

但是,我有点不清楚 do 是否在作弊,因为 do 是 clojure 中的一种特殊形式,我认为没有类似的事情发生SICP 中尚未介绍。 有没有更简约的答案?

这是另一个只对最后一个元素执行 proc 的尝试:

(defn for-each-2 [proc, items]
(let [f (first items)
r (rest items)]
(if (empty? r)
(proc f)
(recur proc r))))

最佳答案

使用doseq一切就绪。例如:

(doseq [e '(1 2 3)]
(prn e))

将打印:

1
2
3
nil

编辑:

如果您想手动实现 for-each 并使用尽可能少的特殊形式,这里有另一种选择,尽管它最终几乎和您的一样短:

(defn for-each [f l]
(cond (empty? l) nil
:else (do (f (first l))
(recur f (rest l)))))

有趣的是,同样的过程可以用 Scheme 写得更简洁,这是 SICP 中使用的 Lisp 方言:

(define (for-each f l)
(cond ((null? l) null)
(else (f (first l))
(for-each f (rest l)))))

关于recursion - 在 Clojure 中实现 foreach (doseq),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456102/

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