代码在这里:
(def fib-seq (lazy-cat [0 1] (map + (rest fib-seq) fib-seq )))
据我所知,这fib-seq
是一个惰性序列生成器,可以生成一系列斐波那契数。
通过看看(take 5 fib-seq)
我会得到如下斐波那契数:
(0 1 1 2 3)
但是我无法弄清楚惰性序列是如何在需要时生成的,所以我在上面添加了一些副作用。
(def fib-seq (lazy-cat [0 1] (map +
(do (println "R") (rest fib-seq))
(do (println "B") fib-seq))))
通过添加println
我希望它打印出来R
,并且B
每当惰性序列在需要时尝试生成新条目时,但不幸的是结果是这样的。
user=> (take 5 fib-seq) ; this is the first time I take 5 elements
(0 R
B
1 1 2 3)
上面的输出看起来已经很奇怪了,因为它没有逐个元素地打印 R 和 B,但让我们看一下下一步。
第一次取元素后:
user=> (take 20 fib-seq)
(0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)
我再也不会收到R
andB
了,这让我很困惑,因为它与我对惰性序列生成的理解相冲突。
有人可以一步一步地向我解释吗?
顺便说一句,有没有可能有一个debug
实用程序来调试它step by step
,就像Java
和C
?