खोज…


सिंटैक्स-नियमों के साथ हाइजेनिक और संदर्भित-पारदर्शी मैक्रोज़

अन्य मुख्य धारा प्रोग्रामिंग भाषा पर एलआईएसपी और स्कीम का सबसे बड़ा लाभ उनकी मैक्रो प्रणाली है। सी प्रीप्रोसेसर और अन्य मैक्रो भाषाओं के विपरीत, स्कीम मैक्रोज़ पार्स कोड को इनपुट के रूप में लेते हैं और आउटपुट के रूप में विस्तारित कोड लौटाते हैं। यह स्कीम के "कोड डेटा है" वाक्यांश के अनुप्रयोगों में से एक है, और यही वह है जो भाषा को इतना शक्तिशाली बनाता है।

मैक्रोज़ इन स्कीम को डिफाइन define-syntax के साथ बनाया गया है, जो एक मैक्रो को कई तरीकों से परिभाषित कर सकता है। सबसे सरल तरीका syntax-rules का उपयोग करना syntax-rules , जो इनपुट कोड को आउटपुट कोड में बदलने के लिए पैटर्न-मिलान का उपयोग करता है।

यह उदाहरण for item in list और for list as item तत्वों पर लूपिंग के लिए for list as item सिंटैक्स के for list as item for item in list एक सरल बनाता है:

(define-syntax for
  (syntax-rules (in as) ; 'in' and 'as' keywords must match in the pattern
    ; When the 'for' macro is called, try matching this pattern
    ((for element in list
          body ...) ; Match one or more body expressions
     ; Transform the input code
     (for-each (lambda (element)
                 body ...)
               list))
    ; Try matching another pattern if the first fails
    ((for list as element
          body ...)
     ; Use the existing macro for the transform
     (for element in list
          body ...))))

फिर इन दो मैक्रोज़ का उपयोग निम्न प्रकार से किया जा सकता है, और अधिक आवश्यक शैली प्रदान करते हैं:

(let ((names '(Alice Bob Eve)))
  (for name in names
    (display "Hello ")
    (display name)
    (newline))
  (for names as name
    (display "name: ")
    (display name)
    (newline)))

कोड चलाने से अपेक्षित आउटपुट मिलेगा:

Hello Alice
Hello Bob
Hello Eve
name: Alice
name: Bob
name: Eve

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

for वाक्य रचना परिभाषाओं से ऊपर की जांच नहीं करते कि क्या वे एक पहचानकर्ता और एक सूची पारित कर रहे हैं, इसलिए करने के लिए किसी भी अन्य प्रकार एक त्रुटि की ओर इशारा करते में परिणाम होगा गुजर for-each के बजाय कॉल for कॉल। इसे डीबग करना मैक्रो के उद्देश्य को पराजित करता है, इसलिए यह उपयोगकर्ता पर निर्भर है कि वे चेक को वहां रखें और उपयोग की त्रुटियों की रिपोर्ट करें, जिसे बाद में संकलन समय पर पकड़ा जा सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow