On 2010-04-04, at 2:47 PM, Mark Engelberg wrote:
> I don't understand why you need to "get rid of the delay" once it has been
> updated. Delays are cheap; why not just be consistent about having your
> data be a ref of a delay? It will keep your code simpler, and that's well
> worth it.
That's one of the possibilities I considered. But after the first change the
delay would always have to be forced (it cannot be left as a delay, see the
example I've posted below). I also didn't want to expose the delay to the
users/programmers trying to use the stuff (too ugly). The approach of defining
a type similar to lazy-ref that can initially have a delay but later have just
a ref is very attractive since there's a ref-like interface for the user and it
avoids the problem shown below.
Here's a bit of code using Per's example code:
(defn bad-thing [n]
(let [not-lazy (ref 0)
lazy (lazy-ref 0)
counter (ref 0)]
(dotimes [i n]
(dosync
(ref-set counter i)
(lazy-alter lazy (fn [x] (+ x @counter)))
(alter not-lazy (fn [x] (+ x @counter)))))
(println "counter: " @counter "lazy:" @lazy "not-lazy:" @not-lazy)
(println "(* n @counter) :" (* n @counter))
(println "(/ (* n (- n 1)) 2) :" (/ (* n (- n 1)) 2))))
With output:
lazy-ref=> (bad-thing 200)
counter: 199 lazy: 39800 not-lazy: 19900
(* n @counter) : 39800
(/ (* n (- n 1)) 2) : 19900
nil
You can see the (very) bad situation of the lazy-ref that depends on other refs
whose values change. This is not just a problem with the lazy-ref, it would be
easy to have the same effect by setting up delays that don't force previous
values.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>
> To unsubscribe, reply using "remove me" as the subject.
----
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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en