Holding onto the head of sequence when using “rest”

柔情痞子 提交于 2019-12-22 10:37:06

问题


I am parsing a big csv file and I am using the first line of it as the keys for the records. So for a csv file like:

header1,header2
foo,bar
zoo,zip

I end up with a lazy seq like:

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

The code working fine, but I am not sure if in the following function I am holding the head of "lines" or not.

(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)))))

Can somebody please clarify?


回答1:


Yes, this expression syntactically says to hold the head

(let [lines (line-seq rdr)

though in this case you should get away with it because their are no references to lines and headers after the call to map and the Clojure compiler starting with 1.2.x includes a feature called locals clearing: it sets any locals not used after a function call to nil in the preamble to the function call. In this case it will set lines and headers to nil in the local context of the function and they will be GCd as used. This is one of the rare cases where clojure produces bytecode that cannot be expressed in java.



来源:https://stackoverflow.com/questions/10902296/holding-onto-the-head-of-sequence-when-using-rest

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!