繁体   English   中英

在clojure中实现foreach(doseq)

[英]implementing foreach (doseq) in clojure

我正在通过SICP工作 - 一个练习就是实施foreach(doseq)。 这是一项学术活动 在clojure中,这就是我想出的:

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

但是,如果do作弊,我有点模糊,因为在clojure中do是一种特殊的形式,我不认为在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)))))

有趣的是,在SICP中使用的Lisp方言Scheme中可以更简洁地编写相同的程序:

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

这是我的尝试。 它只是在内循环中携带函数执行。

(defn for-each [fun, xs]
  (loop [fun fun
         xs xs
         action nil]
    (if (first xs)
      (recur fun (rest xs) (fun (first xs)))
      xs)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM