Funciones de coincidencia de patrones en Clojure?
design-patterns matching (4)
Además, si desea desmontar solo estructuras simples como vectores y mapas (cualquier cosa que sea una secuencia o un mapa, por ejemplo, un registro, de hecho), también podría usar el enlace de desestructuración . Esta es la forma más débil de la coincidencia de patrones, pero aún así es muy útil. A pesar de que se describe en la sección de let
allí, se puede usar en muchos contextos, incluidas las definiciones de funciones.
He usado erlang en el pasado y tiene algunas cosas realmente útiles como funciones de comparación de patrones o "guardias de funciones". Ejemplo de documentos erlang es:
fact(N) when N>0 ->
N * fact(N-1);
fact(0) ->
1.
Pero esto podría expandirse a un ejemplo mucho más complejo donde la forma del parámetro y los valores dentro de él coinciden.
¿Hay algo similar en clojure?
Hay trabajo en curso para hacer esto con la unificación en la biblioteca core.match ( https://github.com/clojure/core.match ).
Dependiendo de exactamente lo que quiere hacer, otra forma común es usar defmulti / defmethod para enviar funciones arbitrarias. Ver http://clojuredocs.org/clojure_core/clojure.core/defmulti (en la parte inferior de esa página está el ejemplo factorial)
Quiero presentar github.com/killme2008/defun , es una macro para definir funciones con coincidencia de patrones como erlang, se basa en core.match. La función de hecho anterior se puede escribir en:
(use ''defun)
(defun fact
([0] 1)
([(n :guard #(> % 0))]
(* n (fact (dec n)))))
Otro ejemplo, un acumulador de cero a número positivo n:
(defun accum
([0 ret] ret)
([n ret] (recur (dec n) (+ n ret)))
([n] (recur n 0)))
Más información, consulte github.com/killme2008/defun
https://github.com/clojure/core.match es una biblioteca de coincidencia de patrones extensible y con todas las funciones para Clojure. Con un poco de magia macro y probablemente puedas obtener una aproximación bastante cercana a lo que estás buscando.