3

大きな csv ファイルを解析しており、その最初の行をレコードのキーとして使用しています。したがって、次のような csv ファイルの場合:

header1,header2
foo,bar
zoo,zip

私は次のような怠惰なseqになります:

({:header1 "foo" :header2 "bar"},
 {:header1 "zoo" :header2 "zip"})

コードは正常に動作していますが、次の関数で「行」の頭を保持しているかどうかはわかりません。

(defn csv-as-seq [file]
  (let [rdr (clojure.java.io/reader file)]
    (let [lines (line-seq rdr)
         headers (parse-headers (first lines))]
      (map (row-mapper headers) (rest lines)))))

誰か明確にしてくれませんか?

4

1 に答える 1

7

はい、この表現は構文的に頭を抱えていると言っています

(let [lines (line-seq rdr)

ただし、この場合、それらは map への参照 linesおよびheaders呼び出し後の参照ではなく、1.2.x 以降の Clojure コンパイラにはlocals clearingと呼ばれる機能が含まれているため、それを回避する必要があります。関数呼び出しの後に使用されていないローカルを nil に設定します。関数呼び出しのプリアンブル。この場合、関数のローカル コンテキストで行とヘッダーが nil に設定され、使用されたとおりに GCd されます。これは、clojure が Java で表現できないバイトコードを生成するまれなケースの 1 つです。

于 2012-06-05T18:25:15.420 に答える