There is a really interesting example of ADT in Clojure here :
Define an ADT generator as follows:
(defmacro data [adt-name equals-sign & constructors] `(do (defn ~(symbol (str adt-name "?")) [~'obj] (= ~(str adt-name) (adt-name ~'obj))) ~@ (for [[type-name & fields] (filter (partial not= '(|)) (partition-by (partial = '|) constructors))] (apply (partial emit-constructor adt-name type-name) fields))))
Given the Haskell example:
data Tree a = Empty | Leaf a | Node Tree Tree
Then we write Clojure
(data Tree = Empty | Leaf value | Node left right)
This is pretty cool.
hawkeye
source share