【问题标题】:Simple Clojure example - getting an infinite loop简单的 Clojure 示例 - 获取无限循环
【发布时间】:2015-11-27 18:35:43
【问题描述】:

我正在尝试一些代码,可以简单地打印出列表中的所有内容。

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

此代码导致打印“全部完成!”的无限循环。和空背靠背。

【问题讨论】:

  • (if (empty?nums) (println "All done!") (do (def first_item (first nums)) (println first_item) (recur (rest nums)))) 因为(when ...不像(if ... 那样有条件地分支

标签: clojure functional-programming


【解决方案1】:

问题是loop 会遍历您提供的所有表单,并且因为when 没有提供其他形式作为您的结束条件点,所以您的循环recurs 永远,打印@987654324 @ 为您的(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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多