I recently came across a situation where I very much wanted to delay  
the calculation of some values, but where I also wanted those delays  
to use their calculated values for equality determinations.  This is  
particularly important when comparing vectors or maps that contain  
delayed values, where doing something like (= (force some-delay) some- 
value) isn't possible.

So, I whipped up a tdelay (transparent delay) macro, an almost  
complete ripoff of clojure.core/delay, except that it creates  
instances of a subclass of clojure.lang.Delay that defers equality and  
hashcode calculations to the delay's value.  The results:

user=> (= {:a 5 :b (delay 12)} {:a 5 :b 12})
false
user=> (= {:a 5 :b (tdelay 12)} {:a 5 :b 12})
true

I get nervous when I screw around with equality in relatively sneaky  
ways like this, so I thought I'd toss this out on the list and see if  
anyone has any comments one way or the other.

- Chas

------

(import '(clojure.lang Delay Util))

(defn make-tdelay
   [fn]
   (proxy [Delay] [fn]
     (equals [other]
       (Util/equals (.deref this) (Delay/force other)))
     (hashCode []
       (Util/hash (.deref this)))))

(defmacro tdelay
   [& body]
   (list 'make-tdelay (list* `#^{:once true} fn* [] body)))

--~--~---------~--~----~------------~-------~--~----~
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
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