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!