common-lisp
パターンマッチング
サーチ…
概要
Common Lispでのパターンマッチングを提供する2つのメインライブラリはOptimaとTriviaです。両方とも類似の一致するAPIと構文を提供します。しかし、トリビアは、マッチした、 defpattern
を拡張する統一されたインタフェースを提供します。
クラック要求のディスパッチ
クラックリクエストはplistとして表現されるので、適切なコントローラにリクエストをルーティングする方法として、clack appへのエントリポイントとしてパターンマッチングを使用できます
(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*)
不一致
パターンマッチングを使用すると、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
ガードパターン
ガードパターンを使用して、値が任意のテストフォームを満たすかどうかをチェックできます。
(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