我正在通过SICP工作 - 一项练习是实施foreach(doseq)。 这是一项学术活动。在clojure中,这就是我提出的:
(defn for-each [proc, items]
(if (empty? items) nil
(do
(proc (first items))
(recur proc (rest items)))))
但是,如果do
作弊,我有点模糊,因为do
是一种特殊的形式,我认为在SICP中还没有引入任何类似的内容。 是否有更简约的答案?
这是另一个只在最后一个元素上执行proc的尝试:
(defn for-each-2 [proc, items]
(let [f (first items)
r (rest items)]
(if (empty? r)
(proc f)
(recur proc r))))
答案 0 :(得分:3)
使用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)))))
有趣的是,在SICP中使用的Lisp方言Scheme中可以更简洁地编写相同的程序:
(define (for-each f l)
(cond ((null? l) null)
(else (f (first l))
(for-each f (rest l)))))
答案 1 :(得分:1)
这是我的尝试。它只是在内循环中执行函数执行。
(defn for-each [fun, xs]
(loop [fun fun
xs xs
action nil]
(if (first xs)
(recur fun (rest xs) (fun (first xs)))
xs)))