生成器模式代码无法返回值

时间:2015-06-05 04:57:15

标签: clojure

我想创建一个生成器,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?

2 个答案:

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