clojure design-patterns matching

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?



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.