2010-03-26 23 views
6

मैं आम लिस्प मैक्रोज़ लिख रहा हूं, इसलिए योजना के आर 5 आर मैक्रोज़ मेरे लिए थोड़ा अप्राकृतिक हैं। मुझे लगता है कि मैं, विचार आया, सिवाय इसके कि मुझे समझ नहीं आता कि कैसे एक वाक्य रचना-नियमों में वेक्टर पैटर्न का प्रयोग करेंगे:सिंटैक्स-नियमों में वेक्टर पैटर्न कैसे उपयोग किए जाते हैं?

(define-syntax mac 
    (syntax-rules() 
    ((maC#(a b c d)) 
    (let() 
     (display a) 
     (newline) 
     (display d) 
     (newline))))) 

(expand '(maC#(1 2 3 4))) ;; Chicken's expand-full extension shows macroexpansion 

=> (let746() (display747 1) (newline748) (display747 4) (newline748)) 

मैं नहीं दिख रहा है कि कैसे मैं उस मैक्रो अपने तर्कों की आवश्यकता का उपयोग करेंगे वेक्टर के रूप में लिखा जाना चाहिए:

(maC#(1 2 3 4)) 
=> 
1 
4 

क्या ऐसी कोई तकनीक है जो उन पैटर्न का उपयोग करती है?

धन्यवाद!

उत्तर

1

एक मैक्रो को अपने तर्कों को वेक्टर के रूप में लिखने की आवश्यकता नहीं हो सकती है, फिर भी जब वे होते हैं तो उपयोगी व्यवहार प्रदान करते हैं। सबसे उल्लेखनीय उदाहरण शायद quasiquote होगा:

;; a couple of test variables 
(define foo 1) 
(define bar 2) 

;; vector literals in Scheme are implicitly quoted 
#(foo bar) ; returns #(foo bar), i.e. a vector of two symbols 

;; however quasiquote/unquote can reach inside them 
`#(,foo ,bar) ; returns #(1 2) 

एक और उदाहरण के रूप में, this pattern matching package जो वैक्टर पर मिलान की अनुमति देता है देख सकते हैं और इस तरह अपनी मैक्रो परिभाषाओं में वेक्टर पैटर्न का उपयोग करता है (पर शामिल लिंक्ड करने के लिए पेज एक साथ पैकेज मेटाडाटा के साथ) ।

+0

धन्यवाद! अब यह बहुत अधिक समझ में आता है! :-) – Jay

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