2011-03-25 13 views
6

He encontrado defadt macro en clojure.contrib.types. Desafortunadamente, no hay documentación útil sobre el uso de ADT en clojure. Busqué en Google durante horas y encontré pequeños fragmentos de información al respecto. ¿Qué son los ADT en Clojure? Cómo usarlos? Cualquier información será útil :)Clojure tipos de datos algebraicos

Respuesta

2

Alguna información se puede encontrar en el archivo examples.clj en src/clojure/contrib/types. Se muestra un ejemplo de una estructura de árbol se define como un ADT:

(defadt ::tree 
    empty-tree 
    (leaf value) 
    (node left-tree right-tree)) 

Más información en el archivo de origen.

+1

¿Está desaprobado definitivamente? –

1

Hay un ejemplo muy interesante de ADT está en Clojure here:

Definimos un generador de ADT como esto:

(defmacro data 
    [adt-name equals-sign & constructors] 
    `(do 
    (defn ~(symbol (str adt-name "?")) [~'obj] 
     (= ~(str adt-name) (adt-name ~'obj))) 
    [email protected](for [[type-name & fields] 
      (filter (partial not= '(|)) 
        (partition-by (partial = '|) constructors))] 
     (apply (partial emit-constructor adt-name type-name) 
       fields)))) 

Dado el ejemplo de Haskell:

data Tree a = Empty 
     | Leaf a 
     | Node Tree Tree 

Entonces escribimos Clojure

(data Tree = Empty | Leaf value | Node left right) 

Que es muy bueno.

Cuestiones relacionadas