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!


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow