मान लीजिए कि मैं एस-अभिव्यक्ति में पहले आइटम के अलावा किसी अन्य चीज़ पर स्कीम मैक्रो ट्रिगर करना चाहता हूं। उदाहरण के लिए, कि मैं एक इन्फ़िक्स शैली :=
साथ define
को बदलने के लिए करना चाहता था लगता है, तो यह है कि:स्कीम मैक्रो जो खोजशब्द द्वारा ट्रिगर किया गया है
(a := 5) -> (define a 5)
((square x) := (* x x)) -> (define (square x) (* x x))
वास्तविक परिवर्तन काफी सरल हो रहा है। इस चाल को :=
अभिव्यक्तियों और मैक्रो-विस्तारित करने के लिए योजना मिल जाएगी। मैंने कोड के आसपास के बड़े वर्गों के बारे में सोचा है जो मानक मैक्रो के साथ इंफिक्स सिंटैक्स का उपयोग करते हैं, शायद: (with-infix-define expr1 expr2 ...)
, और मानक मैक्रो अपने शरीर में अभिव्यक्तियों के माध्यम से चलना और आवश्यक परिवर्तन करना। मुझे पता है कि यदि मैं इस दृष्टिकोण को लेता हूं, तो मुझे उन सूचियों को बदलने से बचने के लिए सावधान रहना होगा जिन्हें वास्तव में डेटा माना जाता है, जैसे उद्धृत सूचियां, और quasiquoted सूचियों के कुछ अनुभाग। मैं क्या कल्पना का एक उदाहरण:
(with-infix-define
((make-adder n) := (lambda (m) (+ n m)))
((foo) :=
(add-3 := (make-adder 3))
(add-6 := (make-adder 6))
(let ((a 5) (b 6))
(+ (add-3 a) (add-6 b))))
(display (foo))
(display '(This := should not be transformed))
तो, मेरे सवाल का दो गुना है:
- अगर मैं
with-infix-define
मार्ग अपनाते हैं, मैं किसी भी ठोकर बोली के अलावा अन्य ब्लॉकों के लिए बाहर देखने के लिए करते हैं और quasiquote? - मुझे लगता है कि मैं पहिया को फिर से शुरू कर रहा हूं। इस प्रकार का कोड चलना बिल्कुल मानक मैक्रो विस्तार प्रणालियों को करना होगा - केवल अंतर यह है कि किसी भी कोड परिवर्तन को करने या नहीं करने का निर्णय लेने पर वे केवल सूची में पहले आइटम को देखते हैं। क्या कोई तरीका है कि मैं मौजूदा सिस्टम पर बस पिगबैक कर सकता हूं?
क्या योजना के लिए कोड-वॉकर पैकेज है? ऐसा लगता है कि आपको बस इतना करना है कि कोड को मैक्रो में लपेटें, उस कोड को चलाएं और स्वैप करें: = पिछले एस-एक्स के साथ, फिर एक प्रतीक मैक्रो परिभाषित करें जो बनाता है: = परिभाषित करने के बराबर। यद्यपि उद्धृत एस-एक्सप पर निश्चित नहीं है। –