Clojure 使用“时抓住序列头”;“休息”;

Clojure 使用“时抓住序列头”;“休息”;,clojure,Clojure,我正在解析一个大的csv文件,并使用它的第一行作为记录的键。因此,对于csv文件,如: header1,header2 foo,bar zoo,zip 我最终得到了一个懒惰的seq,比如: ({:header1 "foo" :header2 "bar"}, {:header1 "zoo" :header2 "zip"}) 代码运行良好,但我不确定在下面的函数中我是否掌握了“行”的开头 有人能澄清一下吗?是的,这个短语在语法上说是把头抱着 (let [lines (line-seq rdr)

我正在解析一个大的csv文件,并使用它的第一行作为记录的键。因此,对于csv文件,如:

header1,header2
foo,bar
zoo,zip
我最终得到了一个懒惰的seq,比如:

({:header1 "foo" :header2 "bar"},
 {:header1 "zoo" :header2 "zip"})
代码运行良好,但我不确定在下面的函数中我是否掌握了“行”的开头


有人能澄清一下吗?

是的,这个短语在语法上说是把头抱着

(let [lines (line-seq rdr)
虽然在这种情况下,你应该摆脱它,因为他们是没有参考
调用map后的
,从1.2.x开始的Clojure编译器包含一个名为局部清除的功能:它在函数调用的前导中将函数调用后未使用的任何局部变量设置为nil。在这种情况下,它将在函数的本地上下文中将行和头设置为nil,并且它们将作为GCd使用。这是clojure产生无法用java表达的字节码的罕见案例之一。

你说的抓住头部是什么意思?你测试代码了吗?它会产生预期的输出吗?@missingfaktor:我想他的意思是,既然在map期间行在范围内,它是否会保持map所消耗的序列,这样在行超出范围之前,序列都不会得到GCed?我不完全确定我是否有正确的该功能的起始版本,有人知道吗?亚瑟,你是对的。我已经用一个csv文件测试了这个函数,这个csv文件在一个64Mb Xmx的JVM上有几百万行,它还没有耗尽内存?它很容易在clojure.lang.Util/ret1中表达。您只有一个方法,它接受两个参数并返回第一个参数。然后,使传递给它的第二个arg产生取消引用的副作用。比如:
f.invoke(Util.ret1(x,x=null))
.Arthur,你在OP的代码中提到的“函数调用后未使用”是指什么?您的意思是,一旦将
交给
rest
,它就被设置为
nil
?(很抱歉问一个关于旧答案的问题,但这个问题显然仍然相关且重要。)@Mars是的,这是正确的。它接受保留行的局部“变量”,并将其值放入调用堆栈后,将保留行的位置设置为nil。
(let [lines (line-seq rdr)