我正在通过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/