common-lisp                
            Correspondance de motif
        
        
            
    Recherche…
Vue d'ensemble
 Les deux bibliothèques principales fournissant une correspondance de modèle dans Common Lisp sont Optima et Trivia . Les deux fournissent une API et une syntaxe de correspondance similaires. Cependant, trivia fournit une interface unifiée pour étendre la correspondance, defpattern . 
Envoi des demandes de clack
Comme une demande de clack est représentée en tant que plist, nous pouvons utiliser la correspondance de modèle comme point d’entrée de l’application clack pour acheminer la requête vers les contrôleurs appropriés.
(defvar *app*
  (lambda (env)
    (match env
      ((plist :request-method :get
              :request-uri uri)
       (match uri
         ("/" (top-level))
         ((ppcre "/tag/(\\w+)/$" name) (tag-page name)))))))
 Remarque: pour lancer *app* nous le transmettons à clackup. ej (clack:clackup *app*) 
match défun
En utilisant une correspondance de motif, on peut entrelacer la définition de fonction et la correspondance de motif, comme pour SML.
(trivia:defun-match fib (index)
  "Return the corresponding term for INDEX."
  (0 1)
  (1 1)
  (index (+ (fib (1- index)) (fib (- index 2)))))
(fib 5)
;; => 8
Modèles de constructeur
Les cons-cells, les structures, les vecteurs, les listes et autres peuvent être associés à des modèles de constructeur.
(loop for i from 1 to 30
      do (format t "~5<~a~;~>"
                 (match (cons (mod i 3)
                              (mod i 5))
                   ((cons 0 0) "Fizzbuzz")
                   ((cons 0 _) "Fizz")
                   ((cons _ 0) "Buzz")
                   (_ i)))
      when (zerop (mod i 5)) do (terpri))
; 1    2    Fizz 4    Buzz 
; Fizz 7    8    Fizz Buzz 
; 11   Fizz 13   14   Fizzbuzz
; 16   17   Fizz 19   Buzz 
; Fizz 22   23   Fizz Buzz 
; 26   Fizz 28   29   Fizzbuzz
Motif de garde
Les patrons de garde peuvent être utilisés pour vérifier qu'une valeur satisfait à une forme de test arbitraire.
(dotimes (i 5)
  (format t "~d: ~a~%"
          i (match i
              ((guard x (oddp x)) "Odd!")
              (_ "Even!"))))
; 0: Even!
; 1: Odd!
; 2: Even!
; 3: Odd!
; 4: Even!