以下是一个打印出意外结果的样例函数的注释。
问题在于:
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...
) )