clojure - 我不知道如何记录/了解 LazySeq 的字符串值

标签 clojure

当我尝试记录其值时,LazySeq 正在踢我的屁股。

(require '[clojure.tools.logging :as log])
(def layer->multipart [{:name "layer-name" :content "veg"} {:name "layer-tag" :content "abs"}])
(def field->multipart [{:name "field-id" :content "12345"} {:name "field-version" :content "v1"}])

(log/infof "concat is %s" (concat layer->multipart field->multipart))
; => 2016-02-16 16:31:11,707  level=INFO [nREPL-worker-38] user:288 - concat is clojure.lang.LazySeq@87177bed 
; WTF is clojure.lang.LazySeq@87177bed?

我已经检查了 How to convert lazy sequence to non-lazy in Clojure答案,它表明我需要做的就是doall,我所有的梦想都会实现。但可惜...不。

(log/infof "concat is %s" (doall (concat layer->multipart field->multipart)))
; => 2016-02-16 16:31:59,958  level=INFO [nREPL-worker-40] user:288 - concat is clojure.lang.LazySeq@87177bed
; still clojure.lang.LazySeq@87177bed is not what I wanted

我观察到 (pr-str (concat layer->multipart field->multipart)) 做了我想要的事情,但它没有意义; pr-str 的文档说了一些关于“pr 到字符串”的内容,pr 的文档说“将对象打印到输出流,即 *out* 的当前值。”。我不希望任何内容*输出*,我只想返回字符串值,以便记录器可以使用它!

(log/infof "concat is %s" (pr-str (concat layer->multipart field->multipart)))
; => 2016-02-16 16:42:02,927  level=INFO [nREPL-worker-1] user:288 - concat is ({:content "veg", :name "layer-name"} {:content "abs", :name "layer-tag"} {:content "12345", :name "field-id"} {:content "v1", :name "field-version"})
; this is what I wanted but I don't want anything going to *out*...or do I?

我必须做什么才能获得 pr-str 变体的效果,而不用担心任何东西无意中转储到标准输出(我猜这就是 *out* )?我希望完全实现用于记录的惰性序列(它永远不会变得太大......它最终只会像连接事故一样惰性)。

如何记录 LazySeq 的完整值?

最佳答案

问题是记录器在后台对您的惰性序列调用 .toString 。试试这个:

user=> (.toString (concat layer->multipart field->multipart))
;; "clojure.lang.LazySeq@87177bed"`

您真正想要的是将序列的内容转换为字符串。例如:

(log/infof "concat is %s" (apply str (concat layer->multipart field->multipart)))
;; Feb 16, 2016 5:10:19 PM clojure.tools.logging$eval420$fn__424 invoke
;; INFO: concat is {:name "layer-name", :content "veg"}{:name "layer-tag",     :content "abs"}{:name "field-id", :content "12345"}{:name "field-version", :content "v1"}

顺便说一下,pr-str 也很好。正如其名称所示,它打印到字符串,而不是 *out*。您正在使用该字符串。

关于clojure - 我不知道如何记录/了解 LazySeq 的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446001/

相关文章:

java - Clojure AWS Lambda 函数中的 OpenCV 目标大于 250MB,如何减小其大小?

clojure - 命名空间对象的名称

clojure - 是否可以从 Clojure 重新定义 Java 方法?

emacs - emacs 中的 clojure cider repl 无法从核心异步回调打印

Clojure:Clojure 中的 core.logic、prolog、逻辑风格编程

java - 使用 Kubernetes Docker 的客户端证书调用端点时出现 SunCertPathBuilderException

clojure - 将 Lighttable 与远程 nrepl 结合使用

collections - Clojure 中的序列和集合有什么区别

java - Scheme 和 Clojure 都可读的模拟 Java 属性文件的语法?

clojure - 我可以在 deftype 中暗示函数的参数类型吗?