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

Dan*_*ero 3 clojure

我正在解析一个大的csv文件,我使用它的第一行作为记录的键.所以对于像以下的csv文件:

header1,header2
foo,bar
zoo,zip
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个懒惰的seq:

({:header1 "foo" :header2 "bar"},
 {:header1 "zoo" :header2 "zip"})
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但我不确定在以下函数中我是否持有"行"的头部.

(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)))))
Run Code Online (Sandbox Code Playgroud)

有人可以澄清一下吗?

Art*_*ldt 7

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

(let [lines (line-seq rdr)
Run Code Online (Sandbox Code Playgroud)

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

  • 字节码不能用java表示?它很容易用clojure.lang.Util/ret1表示.你只有一个方法,它接受两个参数并返回第一个参数.然后你使你传递的第二个arg具有使你的引用无效的副作用.所以类似:`f.invoke(Util.ret1(x,x = null));`. (2认同)