Is there any reason they cannot be implemented as structs with some sort of
type tag?

On Wed, Feb 25, 2009 at 10:26 AM, Konrad Hinsen
<konrad.hin...@laposte.net>wrote:

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