2014-06-18 4 views
12

प्रत्येक सामान्य लिस्प प्रोग्रामर जानता है कि मैक्रोज़ एक शक्तिशाली उपकरण हैं। लिस्प के ऊपर ऑब्जेक्ट ओरिएंटेशन को भाषा विनिर्देश बदलने के बिना अन्य चीजों के साथ, सामान्य लिस्प मैक्रोज का उपयोग किया गया है; रीड-मैक्रोज़ मस्तिष्क झुकने की क्षमताओं के साथ एक और निर्माण है।सामान्य लिस्प मैक्रोज़ और फर्थ मेटाप्रोग्रामिंग क्षमताओं की तुलना

मेटा प्रोग्रामिंग की अनुमति देने वाला एक अन्य कार्यक्रम फर्थ है। 'शब्द' और 'शब्द उत्पन्न' का उपयोग करके, इसे थोड़ा अलग तरीके से किया जाता है।

मैं जानना चाहता हूं, जो किसी भी भाषा में डबल्ड होता है, यदि सामान्य लिस्प मैक्रोज़ और आगे की संरचना चौड़ाई/शक्ति में तुलनीय हैं: क्या आप ऐसा कुछ कर सकते हैं जो आप बाद वाले के साथ नहीं कर सकते ? या ठीक इसके विपरीत?

बेशक, मैं दो भाषाओं की ट्यूरिंग-पूर्णता के बारे में बात नहीं कर रहा हूं: मैं metaprogramming क्षमताओं के बारे में बात कर रहा हूं। सी ट्यूरिंग-पूर्ण है लेकिन केवल एक मूर्ख यह बताएगा कि सी मैक्रोज़ आम लिस्प के लिए शक्ति में तुलनीय हैं।

+2

यह पिछले संस्करण की तुलना में अधिक विशिष्ट है, [लिस्प और फर्थ मैक्रोज़ \ [पकड़ पर]] (http://stackoverflow.com/q/24272856/1281433), जो अच्छा है।बेशक, अब * उस प्रश्न ने वोट दोबारा खोल दिए हैं, और इसका एक करीबी वोट है, इसलिए इसमें कुछ भ्रम है कि इनमें से कौन सा वास्तव में खुला रहता है। यह बहुत स्पष्ट आप इस प्रश्न में जो खोज रहे हैं, लेकिन यह अभी भी शायद विषय से दूर है, क्योंकि [ "तुलना प्रश्न के लिए \ [स्टैक ओवरफ़्लो \] एक गरीब फिट हैं, क्योंकि वहाँ उत्तर देने के लिए कोई सीमा नहीं है जो करने के लिए तैनात किया जा सकता है उन्हें। "] (http://meta.stackoverflow.com/q/251328/1281433)। –

+3

निकटतम कारण ** बहुत व्यापक ** यहां लागू होता है: "या तो * बहुत सारे संभावित उत्तर * हैं, या अच्छे प्रारूप इस प्रारूप के लिए बहुत लंबे समय तक होंगे।" यह ** ** खराब ** प्रश्न नहीं है; यह सिर्फ स्टैक ओवरफ़्लो के लिए विशेष रूप से अच्छा फिट नहीं है। उदाहरण के लिए, comp.lang.lisp में यह प्रश्न बहुत अच्छा हो सकता है। –

+1

विशेष subquestion, "वहाँ कुछ आप पूर्व जो आप बाद? या उपाध्यक्ष प्रतिकूल के साथ ऐसा नहीं कर सकते के साथ कर सकते है?" शायद यहां सबसे विशिष्ट है। यह अभी भी बहुत सारे उत्तरों को स्वीकार कर सकता है, लेकिन यदि ऐसा कुछ है जो कोई ऐसा कर सकता है जो दूसरे नहीं कर सकता है, तो संभवतः अपेक्षाकृत कैनोलिक जवाब देना संभव है। –

उत्तर

7

मेरे विचार में, सामान्य लिस्प मैक्रोज़ फर्थ तत्काल शब्दों के समान हैं। (वास्तव में, वे लिस्प पाठक मैक्रो के लिए सबसे समान है।)

  • वे दोनों प्रक्रियात्मक मैक्रो नहीं है, यानि कि भाषा का संपूर्ण उपयोग कर सकते हैं।

  • दोनों के पास स्रोत कोड इनपुट तक पहुंच है।

  • वे दोनों भाषा में अभिव्यक्त कुछ भी आउटपुट कर सकते हैं। (उदाहरण के लिए लिस्प में एक वस्तु उन्मुख एक्सटेंशन, या आगे में बुनियादी नियंत्रण प्रवाह निर्माणों।)

मुख्य अंतर यह है, शायद, कि हो सकता है आगे "मैक्रो" इनपुट जबकि लिस्प मैक्रो किसी पर कार्य करते हैं, चरित्र तार कर रहे हैं पार्स पेड़

+3

लिस्प मैक्रोज़ एस-एक्सप्रेशन पर काम करता है, जो मुझे लगता है कि गैर-लिस्पर्स को पार्स पेड़ की तरह दिख सकता है, लेकिन फिर भी। मैं इस भेद का उल्लेख करता हूं क्योंकि किसी भी लिस्प बोली में, पठन चरण संकलन चरण से पहले आता है, और इसलिए मैक्रोज़ लिखते समय लिस्पर कोड _as_ डेटा देखते हैं। हाँ homoiconicity! (आप स्पष्ट रूप से यह सब जानते हैं क्योंकि [सामान्य-लिस्प] आपके लिए एक शीर्ष टैग है, लेकिन मुझे लगता है कि यहां अन्य पाठकों को भी अंतर को समझना चाहिए।) –

2

क्षमा करें यदि चर्चा भाई थोड़ा अस्पष्ट प्रतीत हो सकता है, लेकिन कहने के लिए बहुत कुछ है।

मेरे पास लिस्प के केवल सैद्धांतिक ज्ञान है, हाथ नहीं।

दूसरी तरफ, फर्थ के पास भाषा के अंदर एक पूर्ण मेटाप्रोग्रामिंग हो सकती है (लेकिन सामान्य फर्थ नहीं है)। लेकिन मेटाप्रोग्रामिंग पर विचार किया जा सकता है और संभव है लेकिन एक सुसंगत वाक्यविन्यास के बिना। मुझे लगता है कि लिस्प में भी ऐसा ही होता है।

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

bread eat 

हम इसे क्रियान्वित इसे बाद में संदर्भ के लिए रखने के लिए के बजाय इरादे के साथ एक ही वाक्यांश का उल्लेख करने के लिए भी सक्षम होना चाहिए। यह लेखन किया जा सकता है उदा।

{ bread eat } 

ऊपर दिए गए वाक्यांश को बनाए गए ऑब्जेक्ट को ढेर पर छोड़ने के परिणामस्वरूप हो सकता है। लेकिन जैसा कि हमने { और } के रूप में एक नया शब्द बनाया है, हमें इसका भी संदर्भ देने का अधिकार है।

तो, हम का उल्लेख करना चाहते हो सकता है:

{ bread 

हम चाहते हैं कि कैसे जानकारी दे सकती है? एक टेंटेटिव वाक्यविन्यास है: {{ { bread }}

अगर हम पिछले वाक्यांश के लिए नाम XXX देना हम के रूप में प्रारंभिक वाक्यांश लिख सकते हैं:

XXX eat } 

और वाक्यांश ऊपर सही ढंग से ढेर

{ bread eat } 

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

जाहिर है, हमारे पास पहला अनंत स्तर और प्रत्येक क्रमिक स्तर है। तो निष्पादन स्तर गणितीय अनंत पर आधारित हैं।

मैंने उपरोक्त को एक प्रकार के फर्थ के अंदर लागू किया है और पहले स्तर पर (अनंत अनंतता) सब कुछ सुचारू रूप से काम करता है।

में
{ bread eat } { tomatos eat } x 3 = if 

:: तो उदाहरण के लिए एक बजे सक्षम की वाक्य रचना को बदलने के लिए

{ bread eat | tomatos eat } x 3 = if 

को परिभाषित द्वारा किया जाता है यही कारण है कि |} { के रूप में के रूप में bellow:

{{ } { }} "|" define 

या आप की तरह है, तो यह बेहतर है:

2{ } { 2} "|" define 

ऊपर दी गई विधि मेटा भाषा के सही वाक्यविन्यास के साथ भाषा के अंदर ले जाती है और इसे भाषा बनाती है।

तो मेरी राय में, लिस्प और फर्थ दोनों में मेटाप्रोग्रामिंग की संभावना है, लेकिन दोनों में भाषा के एक एकीकृत हिस्से के रूप में संभावना की कमी है।

मेरे पास napl.wikispaces.com पर अधिक जानकारी है।

+1

मेरे पास लिस्प का केवल सैद्धांतिक ज्ञान है, हाथ नहीं। ... मुझे लगता है कि लिस्प में भी ऐसा ही होता है। –

5

मैं एक फॉर्थ कार्यान्वयनकर्ता हूं और फर्थ, आधा दर्जन कार्यान्वयन, कुछ सौ प्रोजेक्ट्यूलर समस्याओं में व्यापक अनुभव है। मैंने एक छोटी वस्तु उन्मुख विस्तार भी किया (छोटा, यानी एक दर्जन रेखाएं या तो)। एलआईएसपी में मेरा अनुभव पाठ्यक्रम स्तर पर बहुत अधिक है, लेकिन मुझे लगता है कि यह कहना उचित है कि LISP की मेटा प्रोग्रामिंग सुविधाएं अधिक व्यवस्थित हैं, और अभ्यास में अधिक शक्तिशाली हैं।

LISP में abstractions के शीर्ष पर abstractions बनाने के लिए अपेक्षाकृत आसान है। फर्थ में अगर मैं गैर-तुच्छ परिभाषाओं वाली वस्तुओं द्वारा परिभाषित रैखिक स्थान पर एक मैट्रिक्स को परिभाषित करना चाहता हूं .. मैं पायथन पर स्विच करता हूं।

कारण कम से कम मेरे लिए भी स्पष्ट है। एलआईएसपी के निर्माता जहां गणितज्ञ, जबकि चक मूर एक व्यावहारिक प्रोग्रामर का अंतिम उदाहरण है, कभी भी सैद्धांतिक समस्या पर अपना समय बर्बाद नहीं करते हैं।