使用“休息”时保持序列的头部

时间:2012-06-05 17:50:23

标签: clojure

我正在解析一个大的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)))))

请有人澄清一下吗?

1 个答案:

答案 0 :(得分:7)

是的,这个表达式在句法上说要保持头部

(let [lines (line-seq rdr)

虽然在这种情况下你应该逃避它,因为它们没有引用 调用map之后的linesheaders以及从1.2.x开始的Clojure编译器包含一个名为 locals clearing 的功能:它将函数调用后未使用的任何本地设置为在函数调用的序言中为零。在这种情况下,它会在函数的本地上下文中将行和标题设置为nil,并且它们将使用GCd。这是clojure产生无法用java表示的字节码的罕见情况之一。