common-lisp
패턴 매칭
수색…
개요
Common Lisp에서 패턴 일치를 제공하는 두 개의 주요 라이브러리는 Optima 및 Trivia 입니다. 둘 다 비슷한 API와 구문을 제공합니다. 그러나 퀴즈는 일치, defpattern
을 확장하는 통일 된 인터페이스를 제공합니다.
클라크 요청 발송
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*)
불협화음
패턴 매칭을 사용하면 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