2008-10-29 7 views
9

मैक्रोज़ के कई उदाहरण लैम्बडा को छिपाने के बारे में प्रतीत होते हैं, उदाहरण के लिए सीएल में खुली फ़ाइल के साथ। मैं विशेष रूप से पीएलटी योजना में मैक्रोज़ के कुछ और विदेशी उपयोगों की तलाश में हूं। मैं फ़ंक्शन का उपयोग करके मैक्रो बनाम उपयोग करने पर विचार करना चाहता हूं।कुछ चीजें हैं जिनका आपने योजना मैक्रोज़ का उपयोग किया है?

+1

पीएलटी योजना अब रैकेट कहा जाता है। देखें http://www.racket-lang.org/ – Stephen

उत्तर

5

मैं केवल बेहतर लैम्ब्डा वाक्य रचना की तरह छोटे बातों के लिए योजना मैक्रो (define-syntax) का उपयोग : http://www.cs.indiana.edu/~dfried/ooo.pdf

लेकिन ईमानदारी से, सभी उपयोगी मैक्रोज़ मैंने परिभाषित किया है डी Paul Graham's On Lisp से चुराया जाता है और पीएलटी योजना में defmacro (define-macro) के साथ लिखना आम तौर पर आसान होता है। उदाहरण के लिए, aifdefine-syntax के साथ बहुत बदसूरत है।

(define-syntax (aif x) 
    (syntax-case x() 
    [(src-aif test then else) 
    (syntax-case (datum->syntax-object (syntax src-aif) '_)() 
     [_ (syntax (let ([_ test]) (if (and _ (not (null? _))) then else)))])])) 

define-syntax यह बहुत ही सरल मैक्रो, जहाँ आप चर पर कब्जा करने की अक्षमता की खुशी हो रही है के लिए उपयोग करने के लिए केवल आसान है कि में अजीब है, और बहुत ही जटिल मैक्रो डीएसएल, जहां आप आसानी से चर को कैप्चर करने में असमर्थता से खुश हैं। पहले मामले में आप इसके बारे में सोचने के बिना कोड लिखना चाहते हैं, और दूसरे मामले में आपने डीएसएल के बारे में काफी सोचा है कि आप syntax-rules/syntax-case भाषा में इसका हिस्सा लिखने के इच्छुक हैं जो टालने के लिए योजना नहीं है रहस्यमय बग।


लेकिन मैं योजना में मैक्रोज़ का उपयोग नहीं करता हूं। Idiomatic योजना इतनी कार्यात्मक है कि कई बार आप केवल एक कार्यात्मक कार्यक्रम लिखना चाहते हैं और फिर कुछ lambdas छुपाएं। मुझे कार्यात्मक ट्रेन मिल गई और अब विश्वास है कि यदि आपके पास लैम्ब्डा के लिए आलसी भाषा या एक अच्छा वाक्यविन्यास है, तो यह भी जरूरी नहीं है, इसलिए मैक्रोज़ पूरी तरह कार्यात्मक शैली में उपयोगी नहीं हैं।

तो मैं Practical Common Lisp और On Lisp की अनुशंसा करता हूं। यदि आप पीएलटी योजना का उपयोग करना चाहते हैं, तो मुझे लगता है कि उनके अधिकांश defmacro मैक्रोज़ define-macro के साथ काम करेंगे। या बस सामान्य लिस्प का उपयोग करें।

+1

यदि आप सिंटैक्स पैरामीटर का उपयोग करते हैं, तो 'एआईएफ' परिभाषित करने के लिए बहुत साफ हो जाता है (और हाइजेनिक!): '(परिभाषित-वाक्यविन्यास-पैरामीटर इसे # एफ) (परिभाषित-सिंटैक्स एआईएफ (वाक्यविन्यास-पार्सर [(_ फिर परीक्षण) # '(चलो ([परिणाम परीक्षण]) (वाक्यविन्यास-पैरामीटर ([यह (नाम बदलें-ट्रांसफॉर्मर परिणाम)]() यदि परिणाम तो))))) – Jack

7

मैं अंतिम प्रश्न का उत्तर देना शुरू कर दूंगा। फ़ंक्शन के बजाय मैक्रो का उपयोग कब करें। मैक्रोज़ उन चीजों को करता है जो कार्य नहीं कर सकते हैं, और कार्य मैक्रोज़ नहीं कर सकते हैं, इसलिए उन्हें मिश्रण करना मुश्किल होगा, लेकिन चलो गहराई से चलें।

जब आप तर्कों का मूल्यांकन करना चाहते हैं तो आप फ़ंक्शन का उपयोग करते हैं और मैक्रोज़ जब आप तर्कों का मूल्यांकन नहीं करते हैं। यह बहुत उपयोगी नहीं है, है ना? जब आप एक पैटर्न देखते हैं और आप अमूर्त करना चाहते हैं तो आप मैक्रोज़ का उपयोग अलग-अलग तरीके से लिखना चाहते हैं। उदाहरण के लिए: मैं foo-create, foo-process और foo-dest नामक तीन कार्यों को परिभाषित करता हूं जो foo के विभिन्न मानों के लिए और समान निकायों के साथ जहां एकमात्र परिवर्तन foo है। एक पैटर्न है लेकिन एक समारोह के लिए एक उच्च स्तर है, तो आप एक मैक्रो बनाते हैं।

मेरे नम्र अनुभव में, योजना में मैक्रोज़ को अन्य लिस्पस जैसे सामान्य लिस्प या Clojure में उपयोग किया जाता है। मुझे लगता है कि यह सबूत है कि शायद स्वच्छ मैक्रोज़ इतना अच्छा विचार नहीं है, और यहां मैं पौलुस ग्राहम के साथ असहमत क्यों हूं। ऐसा इसलिए नहीं है क्योंकि कभी-कभी आप गंदे (गैर-स्वच्छ) होना चाहते हैं, लेकिन क्योंकि स्वच्छ मैक्रोज़ जटिल या घुलनशील होते हैं।

+0

"क्योंकि स्वच्छ मैक्रोज़ जटिल या जटिल हो जाते हैं" - मुझे नहीं लगता कि यह स्वच्छता के कारण है; यह अधिक संभावना है क्योंकि योजना स्वच्छता मैक्रोज़ "उच्च स्तरीय" हैं और योजना के अलावा किसी अन्य भाषा में लिखा जाना चाहिए (जहां तक ​​मेरा संबंध है, योजना के मुकाबले बहुत कम विश्वसनीय है!) यही कारण है कि मुझे आम लिस्प पसंद है और अभी भी योजना में परिभाषित-मैक्रो का उपयोग करें, भले ही आर 5 आरएस में यह अजीब सिंटैक्स-नियम चीज है ...:-) – Jay

3

पीटर सेबेल द्वारा प्रैक्टिकल कॉमन लिस्प, मैक्रोज़ के लिए एक अच्छा परिचय है। पॉल ग्राहम द्वारा लिस्प पर, अधिक जटिल उदाहरणों का एक अच्छा स्रोत हो सकता है। इसके अलावा, सामान्य लिस्प कहते हैं, अंतर्निहित मैक्रोज़ को देखें।

(define-syntax [: x] 
    (syntax-case x() 
    ([src-: e es ...] 
    (syntax-case (datum->syntax-object #'src-: '_)() 
     (_ #'(lambda (_) (e es ...))))))) 

आप लिखते हैं

[:/_ 2] ; <-- much better than (lambda (x) (/ x 2)) 

दान फ्राइडमैन मैक्रो का उपयोग कर OO की एक दिमाग झुकने कार्यान्वयन है की सुविधा देता है कौन सा:

+1

योजना मैक्रोज़! = सामान्य लिस्प मैक्रोज़ –

1

एक और अधिक उन्नत मैक्रो का एक उदाहरण है कि भेष में एक लैम्ब्डा रूप नहीं है है कॉमन लिस्प के मैक्रो है, जो बनाता है साधारण चर पहुँच की तरह वस्तु स्लॉट पहुँच लुक-स्लॉट के साथ:

(with-slots (state door) car 
    (when (eq state :stopped) 
    (setq state :driving-around) 
    (setq door :closed))) 

नोट यह है कि स्थानीय चर के लिए स्लॉट मानों को बाध्य करने और उन तक पहुंचने के समान नहीं है, स्लॉट आपको एसईटीक्यू के माध्यम से स्लॉट को बदलने और तुरंत बाहरी परिवर्तन देखने की अनुमति देता है।

+0

setq का उपयोग वास्तव में setf के पक्ष में बहिष्कृत है। यदि इस तरह के उदाहरण setf के उदाहरण हैं तो यह नए (सामान्य) लिस्पर्स के लिए कम भ्रमित है। – simon

8

नए नियंत्रण संरचनाओं और नई बाध्यकारी संरचनाओं को लागू करने के लिए मैक्रोज़ की आवश्यकता है।

इस प्रकार http://planet.plt-scheme.org पर इन प्रकार की संरचनाओं को देखें। पीएलएएनटी पर आप दोनों दस्तावेज और कोड ब्राउज़ करते हैं।

नए नियंत्रण संरचनाओं के लिए उदाहरण:

http://planet.plt-scheme.org/package-source/soegaard/control.plt/2/0/planet-docs/manual/index.html

नए बंधन रूपों के उदाहरण खोजने के लिए, मैक्रो है कि "हूँ-" के साथ शुरू करने के लिए लग रहे हो। पीएलएएनटी से गणित में भी एक उपयोगी उदाहरण मिलता है।

; Within a (with-modulus n form1 ...) the return values of 
    ; the arithmetival operations +, -, * and^are automatically 
    ; reduced modulo n. Furthermore (mod x)=(modulo x n) and 
    ; (inv x)=(inverse x n). 

    ; Example: (with-modulus 3 (^ 2 4)) ==> 1 

    (define-syntax (with-modulus stx) 
    (syntax-case stx() 
     [(with-modulus e form ...) 
     (with-syntax ([+ (datum->syntax-object (syntax with-modulus) '+)] 
        [- (datum->syntax-object (syntax with-modulus) '-)] 
        [* (datum->syntax-object (syntax with-modulus) '*)] 
        [^ (datum->syntax-object (syntax with-modulus) '^)] 
        [mod (datum->syntax-object (syntax with-modulus) 'mod)] 
        [inv (datum->syntax-object (syntax with-modulus) 'inv)]) 
     (syntax (let* ([n e] 
         [mod (lambda (x) (modulo x n))] 
         [inv (lambda (x) (inverse x n))] 
         [+  (compose mod +)] 
         [-  (compose mod -)] 
         [*  (compose mod *)] 
         [square (lambda (x) (* x x))] 
         [^  (rec^(lambda (a b) 
             (cond 
              [(= b 0) 1] 
              [(even? b) (square (^ a (/ b 2)))] 
              [else  (* a (^ a (sub1 b)))])))]) 
        form ...)))])) 
3

Automata via Macros कागज योजना में मैक्रो के माध्यम से परिमित अवस्था की मशीनों को लागू करने पर एक कार्यात्मक प्रोग्रामिंग मोती प्रस्तुत करता है।

पुस्तक The Reasoned Schemer पुस्तक में उपयोग की जाने वाली तर्क प्रोग्रामिंग भाषा मिनीकेरेन के पूर्ण मैक्रो-आधारित कार्यान्वयन के साथ समाप्त होती है। This paper पुस्तक के मुकाबले मिनीकेरेन और इसके कार्यान्वयन को औपचारिक रूप से और संक्षिप्त रूप से प्रस्तुत करता है।

+0

मैक्रोज़ लिंक के माध्यम से ऑटोमाटा शुद्ध सोना है। मेरे पास एक बड़ा आह था! पल इसे पढ़ना। मुझसे +1 –

0

प्रक्रियाओं के पर्याप्त होने पर मैं उनका उपयोग करता हूं।

1

मेरे पास curry मैक्रो था जब मैं अपने हथेली पर बहुत सी योजना करता था। यह बहुत आसान था।

1

योजना मैक्रोज़ आपको उन विशेषताओं को जोड़ने देते हैं जो मूल भाषा लेखकों ने खुद को शामिल नहीं किया है; मैक्रोज़ के पीछे यह संपूर्ण दर्शन है।

यहां एक छोटा सा उदाहरण है: पीएलटी योजना स्लाइड शो नामक प्रस्तुतियों को लिखने के लिए एक भाषा प्रदान करती है। मैंने एक स्लाइड नंबर को स्लाइड के साथ जोड़ने के लिए मैक्रोज़ का उपयोग किया ताकि मैं उन्हें आसानी से प्रबंधित कर सकूं।

1

मैंने एक मैक्रो लिखा है जो इन्फिक्स सिंटैक्स प्रदान करता है। कुछ भी फैंसी नहीं; कोई प्राथमिकता नहीं जबकि मैं आमतौर पर उपसर्ग वाक्यविन्यास के साथ ठीक हूं, मैं < और> के लिए infix पसंद करते हैं।

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