clojure loop / recur in a range

时间:2016-01-24 01:47:33

标签: loops clojure

我想在3到11的范围内执行loop/recur

(loop [itr 3]
  (if (and (< itr 11) (= 0 (mod itr 4)))
    (println itr)
    (recur (inc itr))
    ))

正如所料,它将返回4。问题是当我在寻找没有任何匹配的东西时:

(loop [itr 2]
  (if (and (< itr 3) (= 0 (mod itr 4)))
    (println itr)
    (recur (inc itr))
    ))

这将使REPL崩溃而不返回nil。有没有办法在这个循环中添加类似else语句的内容,所以如果没有匹配,它会返回nil

1 个答案:

答案 0 :(得分:3)

而不是loop / recur,请考虑使用您可以使用的更高级别的功能:

(first (filter #(zero? (mod % 4)) (range 3 11)))
;=> 4
(first (filter #(zero? (mod % 4)) (range 2 3)))
;=> nil