解析が完了する前にストリームが閉じているので、clojure.data.xml
のXMLファイルを解析する例外が発生します。私は理解していない何Clojure XMLストリームクローズ例外
は(this related answerにより示唆されるように)with-open
がそれを閉じる前doall
は、XMLデータの評価を強制されていない理由は次のとおりです。
(file->xml "example.xml")
;-> XMLStreamException ParseError at [row,col]:[80,1926]
Message: Stream closed com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next
:例外をスロー
(:require [clojure.java.io :as io]
[clojure.data.xml :as xml])
(defn file->xml [path]
(with-open [rdr (-> path io/resource io/reader)]
(doall (xml/parse rdr))))
with-open
ラッパーを削除すると、期待通りにXMLデータが返されます(リーダは保証されていませんが、ファイルは正当なものです)。ので、おそらくそれが関連している
(defn parse
"Parses the source, which can be an
InputStream or Reader, and returns a lazy tree of Element records.
Accepts key pairs with XMLInputFactory options, see http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLInputFactory.html
and xml-input-factory-props for more information.
Defaults coalescing true."
[source & opts]
(event-tree (event-seq source opts)))
を、私が持っている機能はclojure.data.xml READMEの「往復」の例と非常によく似ています
私は(source xml/parse)
は怠惰な結果が得られていることがわかります。
私はここで何が欠けていますか?
Hmm。面白い。何が起こっているのかを明確にする時間をとってくれてありがとう。 – nrako
私はこれを「免疫」と呼ぶことはありません。むしろレイジーシーケンスの怠惰なシーケンスである、レイジーなものの別の_level_であるかのように見えます。 – Svante
私はソースコードを掘り下げませんでしたが、それは構造の "怠惰なマップ"タイプであると思われます。これは 'datomic.query.EntityMap'でも見られます。問題は '' doall''は ''レイジーマップ ''ではなく ''レイジーシーケンス ''のみを対象としていることだと思います。 –