I created a new datatype to solve this problem: http://gist.github.com/958001 c-fn creates a comparable function;
(let [fnmaker4 (fn [coll] (c-fn [n] (nth coll n))) ints (range)] (= (fnmaker4 ints) (fnmaker4 ints))) => true On Thu, May 5, 2011 at 10:41 PM, Alan <a...@malloys.org> wrote: > On May 5, 1:28 pm, Ken Wesson <kwess...@gmail.com> wrote: > > On Thu, May 5, 2011 at 4:16 PM, Alan <a...@malloys.org> wrote: > > > (let [fnmaker4 (fn [coll] (fn [n] (nth coll n))) > > > ints (range)] > > > (= (fnmaker4 ints) (fnmaker4 ints))) > > > > > You want to make it impossible to compare functions that close over > > > infinite sequences? What is the point of being able to compare > > > functions if there are cases in which using the functions will > > > succeed, and the existing comparison strategy would not cause errors, > > > but your new proposal does? > > > > Hm, that is a problem. You'd need to compare not the sequences, but > > their generator functions. :) > > > > > Similarly, if you try to eval such a function, your proposed function- > > > eval semantics would, as I understand it, store its closed-over values > > > in a class constant somewhere. Then there's some secret place holding > > > onto the head of my lazy sequences for me? No thanks. > > > > Your fnmaker4 already holds onto the head of ints, above, so that this: > > > > user=> (def q (fnmaker4 (iterate inc 0))) > > #'user/q > > user=> (q 119) > > 119 > > user=> (q 0) > > 0 > > > > can work properly. > > Right. But if I drop all references to the returned function after I'm > done with it, it gets GCed. If there's some class holding a reference > to it forever, it will never get cleaned up. For example, ((fnmaker4 > (range)) 1e6) will (I think?) currently result in a million ints being > held in memory at once, as things are now. Those things will get > thrown away shortly thereafter, though. I'm not sure I fully > understand your proposal, but it seems to me like you might be making > these stick around permanently if I include the right mixture of eval, > quoting, and unquoting in that expression. > > -- > 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 > -- 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