Поиск…


обзор

Две основные библиотеки, обеспечивающие соответствие шаблонов в Common Lisp, - это Optima и Trivia . Оба обеспечивают аналогичный API-интерфейс и синтаксис. Однако пустяки предоставляют унифицированный интерфейс для расширения соответствия, defpattern .

Отправка запросов Clack

Поскольку запрос clack представлен как plist, мы можем использовать сопоставление шаблонов в качестве точки входа в приложение clack как способ маршрутизации запроса к соответствующим контроллерам

(defvar *app*
  (lambda (env)
    (match env
      ((plist :request-method :get
              :request-uri uri)
       (match uri
         ("/" (top-level))
         ((ppcre "/tag/(\\w+)/$" name) (tag-page name)))))))

Примечание. Чтобы запустить *app* мы передаем его в clackup. ej (clack:clackup *app*)

DEFUN матча

Используя сопоставление с образцом, можно переплетать определение функции и сопоставление шаблонов, аналогично 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

Конструкторские узоры

Консоли, структуры, векторы, списки и т. Д. Могут быть сопоставлены с шаблонами конструктора.

(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

Guard-паттерн

Шаблоны Guard могут использоваться для проверки того, что значение удовлетворяет произвольной тестовой форме.

(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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow