以下是一个包含意外结果的注释示例函数。
问题在于
为什么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的...
) )