生成器模式代码不能 return 值

Generator pattern code can't return value

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

没有得到 return,为什么?

点 A return 中的代码会产生向量 r 吗?

(defn getNums []
  (loop [i  4
         r []]
    (if (<= i 0)
      r
      (recur (dec i) 
             (cons i r)))))

(getNums)

时,是一个clojure宏定义为:

(when test & body)

因此,在您的第一个示例中,when 的正文为:

  (do
  r                
  (recur (dec i) 
         (conj r i)))

when 测试本身被评估为 false,因此不会执行 when 宏的主体。 函数的 return 值因此当其本身为 return 时的 return 值为 nil。例如:

  (when (< 2 1)) ; nil

顺便说一下,有一个内置函数 range 与您的方法相同:

(range 1 10)

并且,以更通用的方式,您可以使用惰性函数 iterate:

(take 10 (iterate inc 1))