假设我写了:
(def stuff
(lazy-seq stuff))
[当我在REPL中要求stuff
的值时,我希望它会陷入无限循环,因为我将stuff
定义为本身(这几乎没有说明此序列)。
但是,我得到一个空序列。
> stuff
'()
为什么?
编辑:“递归”是指递归数据,而不是递归函数。
首先,每个惰性序列只能实现一次。其次,您对stuff
的定义不使用递归-stuff
不是函数。如果查看definition的lazy-seq
,可以看到stuff
的定义扩展为
(def stuff (new clojure.lang.LazySeq (fn* [] stuff)))
当调用fn
构造函数的clojure.lang.LazySeq
arg时,它返回已经实现的相同的惰性序列。因此,当您尝试将延迟序列打印到REPL时,迭代会立即终止并返回nil。
您可以确认stuff
的类型为clojure.lang.LazySeq
user=> (type stuff)
clojure.lang.LazySeq
并且在将stuff
打印到REPL之后,已经实现stuff
user=> (realized? stuff)
false
user=> stuff
()
user=> (realized? stuff)
true
您可以使用递归来获得预期的效果
user=> (defn stuff
[]
(lazy-seq (stuff)))
#'user/stuff
user=> (stuff) ;; Hangs forever.