生成器模式代码不能 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))
我想创建一个生成器来做,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))