On Nov 28, 1:55 pm, Juha Arpiainen <jarpi...@gmail.com> wrote: > On Nov 27, 3:59 am, Gerrard McNulty <gerrard.mcnu...@gmail.com> wrote: > > Hi, > > > I've a head holding problem that I believe is a bug in clojure 1.3. I > > wrote the following function to split a a lazy seq of strings across > > files of x size: > > > (defn split-file > > ([path strs size] > > (trampoline split-file path (seq strs) size 0)) > > ([path strs size part] > > (with-open [f (clojure.java.io/writer (str path "." part))] > > (loop [written 0, ss strs] > > (when ss > > (if (>= written size) > > #(split-file path ss size (inc part)) > > (let [s (first ss)] > > (.write f s) > > (recur (+ written (.length s)) (next ss))))))))) > > The Clojure compiler can't in general clear closed-over variables such > as > 'ss in in #(split-file path ss ...) because the closure could be > called more > than once. > > You could try using an (undocumented, compiler internal) feature > to give more information: (^:once fn* [] (split-file path ss size (inc > part))) > instead of #(split-file ...) and change the call to trampoline to > (trampoline (^:once fn* [] (split-file path (seq strs) size 0))) since > the multi-argument version of trampoline doesn't appear to use ^:once.
But it doesn't need to clear those, because the closure goes out of scope after being called once, and thus its locals are out of scope as well. Am I missing something? -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en