2010-08-22 13 views

Respuesta

9

Bueno, en realidad hay algunas bibliotecas de patrones de coincidencia escritas para Clojure. Las macros de Clojure hacen que este tipo de cosas sea posible. Matchure es uno de los más recientes. Incluso hay algunas cosas para ADTs in contrib.

Sin tener en cuenta eso, lo más parecido que tenemos a los ADT de Haskell en el núcleo Clojure son los nuevos registros y tipos de datos en Clojure 1.2. Pero, a menos que necesite los beneficios que provienen de usar un registro o tipo de datos, generalmente solo usará un mapa. Clojure es un lenguaje dinámico, por lo que no obtendrá verificación de tipo estático si utiliza un registro y de todos modos.

Clojure tiene "desestructuración" que recuerda a la coincidencia de patrones, y se usa mucho en Clojure idiomático. Ver this y this. El primero es una respuesta tuya verdaderamente aquí en SO. ; P

1

mirada a matchure biblioteca - que debe ser incluido en clojure-contrib en tiempo casi

0

me gusta mucho Yap como una biblioteca de coincidencia de patrones.

El hecho de tener tanto palabras clave como símbolos hace que la implementación de la variante sea bastante fácil en la parte superior de una biblioteca de coincidencias de patrones.

3

Depende un poco de lo que está tratando de hacer. Pero suponiendo el caso común de querer comportamiento polimórfico basado en el tipo de datos, protocolos son a menudo una buena aproximación:

(defprotocol Fooable 
    (foo [x])) 

(defrecord AType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "A value: " (:avalue x))))) 

(defrecord BType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "B value: " (:bvalue x))))) 

(foo (AType. "AAAAAA"))  
=> A value: AAAAAA 

(foo (BType. "BBBBBB"))  
=> B value: BBBBBB 

En este contexto, el protocolo define de forma eficaz el conjunto de operaciones que desee en su ADT, y los registros de definir los valores posibles del ADT así como el comportamiento polimórfico para las funciones de protocolo.

Cuestiones relacionadas