我想创建一个生成器,1 2 3 4。
(defn getNums []
(loop [i 4
r []]
(when (<= i 0)
r ;<--- point A
(recur (dec i)
(conj r i)))))
(getNums) ;Eval to nil.
什么都没有回报,为什么?
A点的代码是否会返回结果向量r?
答案 0 :(得分:2)
时,是一个定义为:
的clojure宏(when test & body)
所以,在你的第一个例子中,时间的主体是:
(do
r
(recur (dec i)
(conj r i)))
当测试本身被评估为false时,因此不执行when宏的主体。 函数的返回值因此是返回时的返回值,即nil。例如:
(when (< 2 1)) ; nil
顺便说一下,函数范围中有一个与你的方法相同的构建:
(range 1 10)
而且,以更通用的方式,您可以使用惰性函数 iterate :
(take 10 (iterate inc 1))
答案 1 :(得分:1)
(defn getNums []
(loop [i 4
r []]
(if (<= i 0)
r
(recur (dec i)
(cons i r)))))
(getNums)