2012-04-10 16 views
8

मैं रैकेट में एक वाक्यात्मक रूप है कि एक कीवर्ड तर्क, जिस तरह से कुछ कार्यों कर सकते हैं स्वीकार कर सकते हैं बनाना चाहते हैं।रैकेट मैक्रोज़ कीवर्ड तर्क ले सकते हैं?

एक सरल उदाहरण के लिए यह कम करने के बाद, मैं लेखन की कोशिश की:

(define-syntax sum-of-products 
    (syntax-rules (#:extra) 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 

इस तरह की है कि निम्नलिखित तो काम करेगा:

(sum-of-products ([2 2] [3 3])) → 13 
(sum-of-products ([2 2] [3 3]) #:extra 5) → 18 

दुर्भाग्य से, रैकेट, इस "बुरा वाक्य रचना" कहता है इतनी स्पष्ट रूप से वह प्रयास सही नहीं था।

क्या यह किया जा सकता है?

उत्तर

12

वाक्य रचनात्मक पैटर्न में कीवर्ड संख्याओं जैसे अक्षर आदि के समान व्यवहार किए जाते हैं, इसलिए आपको उन्हें कीवर्ड के रूप में निर्दिष्ट करने की आवश्यकता नहीं है। (यह पहचानकर्ता के लिए केवल आवश्यक है।) तो निम्न कार्य (ध्यान दें कि मैं लिखने में गलती आप दूसरे उदाहरण में था तय):

#lang racket 
(define-syntax sum-of-products 
    (syntax-rules() 
    [(sum-of-products ([a b] ...)) 
    (+ (* a b) ...)] 
    [(sum-of-products ([a b] ...) #:extra extra) 
    (+ extra (* a b) ...)])) 
(sum-of-products ([2 2] [3 3])) 
(sum-of-products ([2 2] [3 3]) #:extra 5) 

एक उपयोगिता है कि parsing keywords को आसान बनाने के लिए कर सकते हैं भी syntax-parse देखें।

+3

विशेष रूप से, 'वाक्यविन्यास-पार्स' दस्तावेज़ में संपूर्ण तर्क [अनुभाग] (http://docs.racket-lang.org/syntax/Optional_Keyword_Arguments.html) कीवर्ड तर्कों के साथ मैक्रोज़ लिखने पर है। –

+0

(उह, मैं उस लिंक को जोड़ना भूल गया ...) –

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