32 votes

Fonctions de correspondance de motifs en Clojure ?

J'ai utilisé erlang dans le passé et il a des choses très utiles comme les fonctions de filtrage ou les "gardes de fonction". Voici un exemple tiré de la documentation d'erlang :

fact(N) when N>0 -> 
    N * fact(N-1); 
fact(0) ->      
    1.    

Mais cet exemple pourrait être élargi à un cas beaucoup plus complexe dans lequel la forme du paramètre et les valeurs qu'il contient sont mises en correspondance.

Existe-t-il quelque chose de similaire en clojure ?

33voto

gilesc Points 1012

Des travaux sont en cours pour y parvenir grâce à l'unification dans la base de données core.match ( https://github.com/clojure/core.match ).

En fonction de ce que vous voulez faire exactement, une autre méthode courante consiste à utiliser defmulti/defmethod pour distribuer des fonctions arbitraires. Voir http://clojuredocs.org/clojure_core/clojure.core/defmulti (au bas de cette page se trouve l'exemple factoriel)

19voto

killme2008 Points 34

Je souhaite vous présenter defun Il s'agit d'une macro permettant de définir des fonctions de recherche de motifs comme en erlang, basée sur core.match. La fonction ci-dessus peut être écrite en :

(use 'defun)
(defun fact
  ([0] 1)
  ([(n :guard #(> % 0))] 
    (* n (fact (dec n)))))

Autre exemple, un accumulateur de zéro à un nombre positif n :

(defun accum
  ([0 ret] ret)
  ([n ret] (recur (dec n) (+ n ret)))
  ([n] (recur n 0)))

Pour plus d'informations, voir https://github.com/killme2008/defun

9voto

Dave Ray Points 20873

core.match est une bibliothèque de filtrage de motifs complète et extensible pour Clojure. Avec un peu de magie macro, vous pouvez probablement obtenir une approximation assez proche de ce que vous recherchez.

3voto

Vladimir Matveev Points 16593

De même, si vous ne voulez démonter que des structures simples comme les vecteurs et les cartes (toute chose qui est une séquence ou une carte, par exemple un enregistrement, en fait), vous pouvez aussi utiliser déstructuration bind . Il s'agit de la forme la plus faible de la recherche de motifs, mais elle est néanmoins très utile. Bien qu'elle soit décrite dans let Dans cette section, il peut être utilisé dans de nombreux contextes, y compris dans la définition de fonctions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X