Clojure中有标准的"foreach"功能吗?

z_a*_*xis 18 clojure

Clojure> (doc foreach)
Unable to resolve var: foreach in this context

Clojure> (doc map)
-------------------------
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
Run Code Online (Sandbox Code Playgroud)

当然,我可以使用"map"来模仿"foreach",但是地图总是返回nil,这使输出在以下函数中变得丑陋:

(defn div618 [p1 p2]
    (let [ratio [0.,0.191,0.236,0.382,0.5,0.618,0.809,1.]
          price (fn [r] (if (<= p1 p2) (+ p1 (* (- p2 p1) r)) (- p1 (* (- p1 p2) r))))]

    (if (<= p1 p2)
        (**map** #(println (format "-------%.3f   %.2f-------" %1 (price %1))) (reverse ratio))
        (**map** #(println (format "-------%.3f   %.2f-------" %1 (price %1)))  ratio))))
Run Code Online (Sandbox Code Playgroud)

祝商祺!

Hug*_*ugh 58

我想doseq可能就是你要找的东西:

(doseq [i [0 1 2 3]] (println i))
Run Code Online (Sandbox Code Playgroud)

然而,这仍然会回归nil--Clojure中的所有形式都将评估为某些价值; 没有与Common Lisp相同的东西(values).

  • @z_axis:勾选左侧的复选标记以接受答案.此外,您可能想要提升它. (12认同)

Gor*_*son 6

从Clojure 1.7开始,您可以使用run!

user=> (run! println (range 10))

0
1
2
3
4
5
6
7
8
9
=> nil  ; returns nil
Run Code Online (Sandbox Code Playgroud)

请参阅此答案,了解如何在单独的行clojure上打印列表的每个项目?


Kev*_*vin 2

我认为你想要 clojure 的列表理解,请参阅:http ://en.wikibooks.org/wiki/Clojure_Programming/Concepts#List_Compressive