2012-02-12 17 views
6

के बाद से गाइड में सभी उदाहरणों सूचियों के साथ कर रहे हैं, मुझे लगता है यह मुश्किल कैसे रैकेट में पैटर्न मिलान का उपयोग करने के लिए सशर्त मिलान लिखने के OCaml तरह करता है, उदाहरण के लिए देखने के लिए:सशर्त रैकेट में मिलान पैटर्न

read ~var_a var_b s = match s.[0] with 
    | _ when var_b >= var_a + 4 -> 
     (* Do something *) 
    | "a" when is_negative var_b -> 
     (* Do something else *) 
    ... 

मैं रैकेट में कुछ कैसे लिखूंगा?

धन्यवाद।

उत्तर

10

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"])) 
+3

, का उपयोग करते हुए इतने सारे '?' चलता है कि यह एक सादा के साथ बेहतर व्यक्त होगी 'cond' ... –

3

पैटर्न मिलान को आसानी से परीक्षणों के अनुक्रम में अनुवादित किया जा सकता है, ऐसी कोई भाषा नहीं है जहां आप ऐसा नहीं कर सकते।

ओकैमल (और शायद हास्केल) पैटर्न-मिलान के साथ क्या बढ़िया है यह है कि संकलक कोड को इष्टतम अनुक्रम में अनुवाद करता है जब यह संभव हो (यानी प्रोग्राम कभी भी एक ही स्थिति में दो बार परीक्षण नहीं करेगा, कम से कम जब आप इससे बचें when गार्ड)।

+1

मैं उम्मीद होती है कि एक ही रैकेट में क्या होता है के बाद से यह स्पष्ट पैटर्न capablities मिलान है, नहीं? – GiantSquid

+1

यदि आप 'मिलान' का उपयोग करते हैं तो शायद यह मामला है, लेकिन यदि आप 'cond' का उपयोग नहीं करते हैं। लेकिन मैं रैकेट में कोई विशेषज्ञ नहीं हूं, केवल ओकैमल में। –

संबंधित मुद्दे