有没有标准;foreach“;在Clojure中的功能?

有没有标准;foreach“;在Clojure中的功能?,clojure,Clojure,当然,我可以使用“map”来模拟“foreach”,但map总是返回nil,这使得以下函数中的输出很难看: 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]

当然,我可以使用“map”来模拟“foreach”,但map总是返回nil,这使得以下函数中的输出很难看:

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])
(defn div618[p1 p2]
(让[比率[0,0.191,0.236,0.382,0.5,0.618,0.809,1]

price(fn[r](如果(我想你想要clojure的列表理解,请参阅:

我想
doseq
可能是你想要的:

(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))))

但是,这仍然会返回
nil
——Clojure中的所有表单都将计算为某个值;没有与Common Lisp的
(值)等价的值

map用于将函数f应用于seq的每个元素,在您的示例中,应用print返回nil,因此您得到一个中间的nil序列,然后将其丢弃。当您需要像打印这样的副作用时,请使用doseq


Clojure没有单一的foreach表单映射、reduce filter等。从技术上讲,这些都是foreach表单,它们对seq中的每个元素都有作用。此外,map是惰性的。您的示例将只在repl中打印,因为repl强制惰性seq自己实现它们。比如说,如果您将其打包在一个罐子中,它将不会做任何事情。

您可以使用doseq或下面是使用doall的示例

(doseq [i [0 1 2 3]] (println i))
(第618部分定义[p1 p2] (让[比率[0,0.191,0.236,0.382,0.5,0.618,0.809,1] 价格(fn[r](如果)(定义为第618部分[p1-p2] (让[比率[0.000 0.191 0.236 0.382 0.500 0.618 0.809 1.000] 价格#(如果(p2(-p1)(*%)(+p1)) (->p1(-p2)(*%)(-p1))) 打印全部(doseq[项目%) (printf“----%.3f%.2f----\n”项目(价格项目))]
(如果从Clojure 1.7开始(),您可以使用:


参见to

Clojure>(适用于[x(范围10)](inc x))(1 2 3 4 5 6 7 8 9 10)Clojure>(适用于[x(范围10)](println x))(无无无无无无无无无无)什么是
**map**
?您的意思是用粗体设置名称吗?另外,您知道您可以在标记之间的任何位置使用换行符,对吗?@z_axis:勾选左侧的复选标记以接受答案。此外,您可能希望对其进行投票。注意:不使用逗号,使用线程优先的特殊从左到右的数学语法(
->
),和
doseq
,基本上是Clojure的
foreach
。这正是我要找的。就像Julia的
foreach
(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))))] (doall (map #(println (format "-------%.3f %.2f-------" %1 (price %1))) (if (<= p1 p2) (reverse ratio) ratio))))) (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))))] (map (fn [x] [x (price x)]) (if (<= p1 p2) (reverse ratio) ratio)))) (doall (map #(println (format "-------%.3f %.2f-------" (first %1) (last %1))) (div618 1 2)))
(defn div618 [p1 p2]
  (let [ratio [0.000 0.191 0.236 0.382 0.500 0.618 0.809 1.000]            
        price #(if (<= p1 p2)
                 (-> p2 (- p1) (* %) (+ p1))
                 (-> p1 (- p2) (* %) (- p1)))
        print-all #(doseq [item %]
                     (printf "-------%.3f   %.2f-------\n" item (price item)))]
    (if (<= p1 p2)
      (print-all (reverse ratio))
      (print-all ratio))))
user=> (run! println (range 10))

0
1
2
3
4
5
6
7
8
9
=> nil  ; returns nil