2011-11-27 19 views
18

रैकेट में सरल पाठक मैक्रोज़ बनाने का कोई तरीका है। मैं इस तरह एक सामान्यीकरण मतलब है:रैकेट रीडर मैक्रोज़

(define-reader-syntax "'" quote) 
; finds expressions that start with "'" and wraps them in `(quote ...)` 
'(foo) ; => (quote (foo)) 
'foo ; => (quote foo) 

मैं एक मैं स्पष्ट क्या मतलब बनाने के लिए वाक्य रचना में बनाया करते थे। उन चीजों में से एक जो मैं इसका उपयोग करना चाहता हूं, क्लोजर के शॉर्टेंड लैम्ब्डा (#(+ 1 %) 5) ; => 6

ऐसा लगता है कि "शॉर्टंड-लैम्ब्डा" मैक्रो को परिभाषित करना और उस पर "#" उपसर्ग को मानचित्र करना बहुत आसान होगा।

+0

आप के लिए कोड को देख में रुचि हो सकती [afl] (https://github.com/AlexKnauth/afl) या [घुंघराले-एफएन] (https://github.com/lexi-lambda/racket-curly-fn), जिनमें से दोनों पाठक के पूर्ण कार्यान्वयन को परिभाषित करते हैं शॉर्टेंड लैम्ब्डा अभिव्यक्तियों के लिए एक्सटेंशन। –

उत्तर

8

यह देखने के लिए readtables और reader extensions पर मार्गदर्शिका प्रविष्टि को देखें। यह reference section भी उपयोगी है। रीडटेबल एक्सटेंशन आपके उदाहरण की तुलना में थोड़ा अधिक जटिल हैं, लेकिन वे बहुत शक्तिशाली हैं।

आपकी विशिष्ट समस्या के लिए, SRFI-26 योजना के लिए एक समान वाक्यविन्यास प्रदान करता है और सैम टोबीन-होचस्टेड ने fancy app रैकेट मैक्रो लिखा जो स्कैला के इस पर लागू होता है। ' को

#lang racket 

(define rt (make-readtable #f #\# 'non-terminating-macro 
          (λ (c in . _) 
          (define body (read in)) 
          `(lambda (%) ,body)))) 
(parameterize ([current-readtable rt] 
       [current-namespace (make-base-namespace)]) 
    (eval (read (open-input-string "(#(+ 1 %) 5)")))) ;; => 6 

यहां अपने सरल उदाहरण को लागू करने की है, जिससे & बराबर हो:

16

यहां अपने आशुलिपि लैम्ब्डा लागू करने के लिए है

(define rt2 (make-readtable #f #\& #\' #f)) 

(parameterize ([current-readtable rt2] 
       [current-namespace (make-base-namespace)]) 
    (eval (read (open-input-string "&(3 4 5)")))) ;; => '(3 4 5) 
+0

पहले उदाहरण से '(λ (सी इन। _) 'में,' सी' क्या है? – adrusi

+1

यह वह वर्ण है जो पाठक मैक्रो को ट्रिगर करता है, इस मामले में हमेशा '# \ #'। ['बनाने के लिए प्रलेखन देखें -readtable'] (http://pre.racket-lang.org/docs/html/reference/readtables.html#%28def._%28%28quote._~23~25kernel%29._make-readtable%29% 29)। –

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