common-lisp
पैटर्न मिलान
खोज…
अवलोकन
कॉमन लिस्प में पैटर्न से मेल खाने वाले दो मुख्य पुस्तकालय ऑप्टिमा और ट्रिविया हैं । दोनों एक समान मिलान एपीआई और वाक्यविन्यास प्रदान करते हैं। हालाँकि, ट्रिविया एक एकीकृत इंटरफ़ेस प्रदान करता है ताकि मिलान, defpattern
का विस्तार किया जा defpattern
।
क्लैक अनुरोध भेजना
क्योंकि एक क्लैक अनुरोध को एक प्लिस्ट के रूप में दर्शाया जाता है, हम पैटर्न मिलान का उपयोग क्लैक ऐप में प्रवेश बिंदु के रूप में उनके उचित नियंत्रकों के लिए मार्ग अनुरोध के रूप में कर सकते हैं।
(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*
शुरू करने के लिए *app*
हम इसे क्लैकअप के पास भेजते हैं। ईजे (clack:clackup *app*)
defun मैचों
पैटर्न से मेल खाते हुए एसएमएल के समान फ़ंक्शन की परिभाषा और पैटर्न मिलान को आपस में जोड़ सकते हैं।
(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!