首页 > 解决方案 > 如何在 Clojure 的 while 循环中应用嵌套的 for 循环?

问题描述

在 Python 的 while 循环中应用多个嵌套的 for 循环很容易。但是,在 Clojure 中并非如此。据我了解,“for”、“while”或“loop”;它们都是宏的。请评论如何用惯用的 Clojure 代码编写循环?

n = 1
while n < 10:

    for i in range(10):
        print("for loop 1")
        for j in range(10):
            print("for loop 2")

    print("back to loop")

    for j in range(10):
        print("loop3")

    print("back to loop again")
    n += 1

for 循环不执行,如何编写惯用的 Clojure 代码?

(defn Example []
  (def n (atom 1))
  (while (< @n 10)
    (do
      (println @n)
      ;; for loop does not execute
      (for [i (range 10)]
        (println "for loop 1")
        ;; for loop does not execute
        (for [j (range 10)] (println "for loop 2")))

      (println "back to loop")
      ;; for loop does not execute
      (for [j (range 10)] (println "for loop 3"))
    
      (println "back to loop again")

      (swap! n inc))))

(Example)

标签: pythonclojure

解决方案


for是懒惰的。如果你玩的是副作用,你需要用他的表弟代替他doseq

关于您的代码的一些注释:

  • do循环内的 a是while多余的,省略它。
  • 两种语言的while循环都不是真正地道的。在 python 中它会是另一个for,在 clojure 中dotimes
  • (doseq [i (range 10)] ..)可能只是(dotimes [i 10] ..)

推荐阅读