以下是一个例子:
(defn f1 [] (lazy-seq (cons 0 (f2))))
(defn f2 [] (lazy-seq (cons 1 (f3))))
(defn f3 [] (lazy-seq (cons 2 (f1))))
在Haskell中,上面的例子相当于生成了一个惰性序列 [0, 1, 2, 0, 1, 2, ...],但在Clojure中,这会导致CompilerException错误,因为
f2
无法解析。是否有任何解决办法?
以下是一个例子:
(defn f1 [] (lazy-seq (cons 0 (f2))))
(defn f2 [] (lazy-seq (cons 1 (f3))))
(defn f3 [] (lazy-seq (cons 2 (f1))))
f2
无法解析。使用declare
创建前置声明
user> (declare f1)
#'user/f1
user> (declare f2)
#'user/f2
user> (declare f3)
#'user/f3
user> (declare f1 f2 f3)
#'user/f3
同样有效
user> (defn f1 [] (lazy-seq (cons 0 (f2))))
#'user/f1
user> (defn f2 [] (lazy-seq (cons 1 (f3))))
#'user/f2
user> (defn f3 [] (lazy-seq (cons 2 (f1))))
#'user/f3
user> (take 20 (f3))
(2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0)
letfn
在本地定义一组相互递归的函数:(letfn [(f1 [] (lazy-seq (cons 0 (f2))))
(f2 [] (lazy-seq (cons 1 (f3))))
(f3 [] (lazy-seq (cons 2 (f1))))]
(f1))
=> (0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 ...