Although (as I just realized), it fails miserably with closures.

On Thu, May 5, 2011 at 11:38 PM, Jonathan Fischer Friberg <
odysso...@gmail.com> wrote:

> 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

Reply via email to