这是一个注释过的示例函数,它打印出意外结果。
问题在于
为什么 doall 没有提供给我实际数据,使我无法从中生成字符串?
如果 doall 不起作用,我如何访问懒性序列下面的数据?
这是 1.11.1 版本中的 bug,还是我完全误解了 doall?
以下是演示代码
(defn lazytest []
(let [a [1 2 3 4] b [1 0 3 9] res (map #(if (= %1 %2) %1) a b)]
(println (str res))
;; 这个惰性序列的 .toString 是类似 clojure.lang.LazySeq@e8c3d 的内容
(println (str (doall res)))
;; doall 应该使其物化,但它仍然只返回了惰性序列!!
(println "seq is a " (class res))
;; 这是一个 clojure.lang.LazySeq
(println "doall results in a " (class (doall res)))
;; 这也是一个 clojure.lang.LazySeq!!!什么鬼?
(println res) ;; this prints (1 nil 3 nil) which I would
;; expect also from the second println above!
(println "are res and (doall res) identical? " (identical? res (doall res)))
;; 打印 true,这似乎是错误的/有 bug...
) )