我正在尝试一些简单的代码打印出列表中的所有代码。
我创建一个循环 - 如果列表为空,则打印出一条消息并退出。否则,获取列表中的第一个项目,将其打印出来,然后使用除第一个元素之外的所有内容重复列表。
(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))
)
此代码导致无限循环打印"全部完成!"并且背对背。
答案 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!")))
此外,如果您对循环序列的其他可能性没有任何问题,您也可以使用doseq
或for
进行列表理解:
(doseq [nums number-list] (println nums))
(for [nums number-list] (println nums))