简单的Clojure示例 - 获得无限循环

时间:2015-11-27 01:07:09

标签: clojure functional-programming

我正在尝试一些简单的代码打印出列表中的所有代码。

  1. 我定义了numberList
  2. 我创建一个循环 - 如果列表为空,则打印出一条消息并退出。否则,获取列表中的第一个项目,将其打印出来,然后使用除第一个元素之外的所有内容重复列表。

    (def numberList [1, 2, 3, 4, 5])
    
    (loop [nums numberList]
        (when (empty? nums)
          (println "All done!"))
        (def first_item (first nums))
        (println first_item)
        (recur (rest nums))
    )
    
  3. 此代码导致无限循环打印"全部完成!"并且背对背。

1 个答案:

答案 0 :(得分:2)

问题是loop遍历了您提供的所有表单,并且由于when不提供其他形式作为结束条件点,因此您的循环recur s永远地,为nil打印(first nums)(因为它已空)和"All done!"

您应该使用if代替when,它会为您提供以下表单:

(if test then-form else-form)

if评估测试,如果它返回逻辑true评估then-form,否则跳转到else-form。 也不要在顶级以外的地方使用def,因此最好在你的循环片之前而不是在它的内部,因为每次循环执行循环时它都会定义,这是不必要的(它也只是没有)看起来真好!)

所以你的循环看起来像这样:

(def number-list [1, 2, 3, 4, 5])

(loop [nums number-list]
  (if (empty? nums)
    (println "All done!")
    (do (println (first nums)) (recur (rest nums)))))

或:

(loop [nums number-list]
  (if (seq nums)
    (do (println (first nums)) (recur (rest nums)))
    (println "All done!")))

此外,如果您对循环序列的其他可能性没有任何问题,您也可以使用doseqfor进行列表理解:

(doseq [nums number-list] (println nums)) 
(for [nums number-list] (println nums))