Rich has said that he intentionally didn't want to provide a uniform
interface for setting and altering reference-like objects, and I agree
with him. It wouldn't be difficult to have to have a function that
calls send on agents, swap! on atoms, set! on vars and ref-set on
refs. But it would give the false illusion that the user is dealing
with a uniform abstraction when the semantics are really very
different. Certainly lazy vs non-lazy semantics are pragmatically very
different in a language like Clojure and the difference shouldn't be
swept under the rug.

-Per

On Mon, Apr 5, 2010 at 1:34 AM, Bob Hutchison <hutch-li...@recursive.ca> wrote:
>
> On 2010-04-04, at 11:15 AM, Per Vognsen wrote:
>
>> Interesting question. Here's something I whipped up in response:
>>
>> http://gist.github.com/355456
>>
>> I intentionally provide only lazy-alter and no lazy-ref-set. The
>> reason is that lazy-alter can be coded so that all the unwrapping and
>> rewrapping of delays can be abstracted away from the user-provided
>> transformation function. A lazy-ref-set function would impose a much
>> stricter discipline on the user in order to maintain laziness.
>>
>> All the usual caveats about full laziness apply: beware of space
>> leaks, delayed side effects, etc.
>
> Okay, I've had a closer look at what you've done. Thanks again.
>
> I don't need the delay after the alter. This makes lazy-ref-set pretty easy 
> to use. So I defined that function and modified your lazy-alter 
> implementation.
>
> This is beginning to look like a single type that is the combination of a ref 
> wrapping a delay, and it seems to work. I can also do some interesting things 
> when the alter/ref-set happens. So this is getting even better.
>
> Still this isn't quite 'in the language'. The user has to know that it's a 
> lazy ref: the functions lazy-alter/lazy-ref-set have to be used rather than 
> alter/ref-set. This is unfortunate I think. So I tried using defmethod, along 
> the lines of the the contrib libraries generic.arithmetic and 
> generic.comparison. Anyway, I've managed to define methods for alter and 
> ref-set that will dispatch properly, and so only alter/ref-set are needed 
> (it's an illusion maybe, but useful)
>
> Anyway, looks like this'll work well.
>
> Cheers,
> Bob
>
>>
>> -Per
>>
>> On Sun, Apr 4, 2010 at 9:35 PM, Bob Hutchison <hutch-li...@recursive.ca> 
>> wrote:
>>>
>>> Hi,
>>>
>>> I have a situation where:
>>>  1) I have a lot of 'values' that are both expensive to compute and quite 
>>> large (they aren't all going to fit into memory) and most of which will not 
>>> be needed (this time, but maybe later)
>>>  2) I may have a need to update several of them them (in a transaction)
>>>
>>> The first case looks to be perfectly suited to delays. The second to refs. 
>>> The values are going to be deftypes.
>>>
>>> So what I've come up with is a ref -> a delay -> a deftype.
>>>
>>> This is fine but it gets troublesome fast.
>>>
>>> The first time you try to get the deftype you have to write something like 
>>> @@my-thing, and you keep writing that until the value is updated. The 
>>> update will make the 'path' a ref -> a deftype (the delay is gone). This is 
>>> bad I think because you now have to write @my-thing to get the value.
>>>
>>> The best that I've come up with is to update the ref with another delay, 
>>> kind of like: (dosync (ref-set my-thing (delay my-updated-thing)))
>>>
>>> Is the the way to do it? Is there something better I could be doing? 
>>> Something deref-able that I'm missing that is better suited than delay? 
>>> Some kind of deref-all-the-way function?
>>>
>>> Thanks,
>>> Bob
>>>
>>>
>>> ----
>>> Bob Hutchison
>>> Recursive Design Inc.
>>> http://www.recursive.ca/
>>> weblog: http://xampl.com/so
>>>
>>>
>>>
>>>
>>> --
>>> 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
>>>
>>> To unsubscribe, reply using "remove me" as the subject.
>>>
>>
>> --
>> 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
>
> ----
> Bob Hutchison
> Recursive Design Inc.
> http://www.recursive.ca/
> weblog: http://xampl.com/so
>
>
>
>
> --
> 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