racket/match
लाइब्रेरी में पैटर्न मिलान शामिल है जो ?
पैटर्न के माध्यम से मनमाने ढंग से भविष्यवाणी कर सकता है। and
के साथ, आपको रैकेट के मैचर को व्यवहार करने में सक्षम होना चाहिए। हालांकि मैं अपनी OCaml में एक छोटे से कमजोर हूँ, मैं कोड की निम्न अनुवाद ऊपर अपने अर्थ से मेल खाता है लगता है:
(define (my-read #:var-a var-a var-b s)
(match (string-ref s 0)
[(and _
(? (lambda (_)
(>= var-b (+ var-a 4)))))
"do something"]
[(and '#\a
(? (lambda (_)
(< var-b 0))))
"do something else"]))
;; Exercising the first case:
(my-read #:var-a 50
60 "blah")
;; Exercising the second case:
(my-read #:var-a 50
-40 "alphabet")
?
मिलान है एक अंतर्निहित and
, यह के रूप में एम्बेडेड तो कोड से थोड़ा अधिक व्यक्त किया जा सकता संक्षेप के रूप में:
(define (my-read #:var-a var-a var-b s)
(match (string-ref s 0)
[(? (lambda (_)
(>= var-b (+ var-a 4))))
"do something"]
[(? (lambda (_)
(< var-b 0))
#\a)
"do something else"]))
दोनों में, वहाँ में lambdas नहीं देख रहे हैं क्या मिलान किया गया, तो मैं सिर्फ उन्हें _
नाम के एक नहींं-देखभाल निरूपित करने के लिए। लेकिन आप अधिक परिष्कृत पैटर्न की कल्पना कर सकते हैं जहां भविष्यवाणियों ने वास्तव में मेल खाने के बारे में गहराई से देखभाल की थी।
एली यहाँ एक सामान्य cond
का उपयोग कर, के बाद से वहाँ कोई महत्वपूर्ण कोड में मिलान पैटर्न नहीं है पता चलता है। मैं सहमत हूँ। कोड इस तरह दिखेगा:
(define (my-read #:var-a var-a var-b s)
(cond
[(>= var-b (+ var-a 4))
"do something"]
[(and (char=? (string-ref s 0) #\a)
(< var-b 0))
"do something else"]))
, का उपयोग करते हुए इतने सारे '?' चलता है कि यह एक सादा के साथ बेहतर व्यक्त होगी 'cond' ... –