这里是一个打印出预期结果的示例函数。
问题在于
为什么doall不提供实际数据,以便我可以从它们生成一个字符串?
如果doall不起作用,我如何获取延迟序列下隐藏的数据?
这是1.11.1版本中的错误,还是我对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!!!WTF?
(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...
) )