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

10-11 05:54