I have just added a new library to clojure.contrib. It provides a  
proof-of-concept implementation of algebraic data types. An example  
for what you can do with it:

(deftype tree
   empty-tree
   (leaf value)
   (node left-tree right-tree))

(def a-tree (node (leaf :a)
                  (node (leaf :b)
                        (leaf :c))))

(defn depth
   [#^tree t]
   (match t
     empty-tree  0
     (leaf n)    1
     (node l r)  (inc (max (depth l) (depth r)))))

(depth empty-tree)
(depth a-tree)


For more examples, see clojure.contrib.types.examples.

The reason why I call this a proof-of-concept implementation is that  
it has a major drawback that seriously limits its applicability:  
equality tests on objects created from these types are done by  
identity, not by value equality, which makes them practically  
useless. This is due to the fact that the objects are actually  
implemented as closures. Another drawback, following as well from the  
implementation as closures, is that the objects cannot have any meta- 
data attached.

Closures are the simplest way to create a new Java class in Clojure,  
but they have the disadvantage of equality-by-identity. I have an  
idea for a better implementation, based on gen-class and proxy, but  
before embarking on this I'd like to see some feedback on the current  
implementation. Is this something you would like to use?

Konrad.


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