无限递归惰性序列在Clojure中显示为空序列

问题描述 投票:0回答:1

假设我写了:

(def stuff
  (lazy-seq stuff))

[当我在REPL中要求stuff的值时,我希望它会陷入无限循环,因为我将stuff定义为本身(这几乎没有说明此序列)。

但是,我得到一个空序列。

> stuff
'()

为什么?


编辑:“递归”是指递归数据,而不是递归函数。

clojure
1个回答
2
投票

首先,每个惰性序列只能实现一次。其次,您对stuff的定义不使用递归-stuff不是函数。如果查看definitionlazy-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.
© www.soinside.com 2019 - 2024. All rights reserved.