2008-08-05 15 views
41

मैंने बहुत कुछ पढ़ा है कि LISP फ्लाई पर वाक्यविन्यास को फिर से परिभाषित कर सकता है, संभवतः मैक्रोज़ के साथ। मैं उत्सुक हूं कि यह वास्तव में कितना दूर जाता है? क्या आप भाषा संरचना को फिर से परिभाषित कर सकते हैं कि यह सीमा रेखा किसी अन्य भाषा के लिए एक कंपाइलर बन जाती है? उदाहरण के लिए, क्या आप LISP की कार्यात्मक प्रकृति को अधिक ऑब्जेक्ट ओरिएंटेड सिंटैक्स और सेमेन्टिक्स में बदल सकते हैं, हो सकता है कि रूबी जैसे कुछ सिंटैक्स के करीब हो?LISP मैक्रोज़ कितनी दूर जा सकते हैं?

विशेष रूप से, मैक्रोज़ का उपयोग करके ब्रांड्स के नरक से छुटकारा पाने के लिए संभव है? मैंने अपने स्वयं के सूक्ष्म विशेषताओं के साथ Emacs को अनुकूलित करने के लिए पर्याप्त (Emacs-) LISP सीखा है, लेकिन मैं बहुत उत्सुक हूं कि भाषा को अनुकूलित करने में मैक्रोज़ कितने दूर जा सकते हैं।

+3

ध्यान दें कि लिस्प वस्तु उन्मुख है। सामान्य लिस्प ऑब्जेक्ट सिस्टम देखें। – catphive

+2

[पीटर Norvig] (http://norvig.com/bio।एचटीएमएल) ने अपनी [पुस्तक] (http://norvig.com/paip.html) में एक [Prolog Interpreter] (http://norvig.com/paip/prolog.lisp) बनाया है। –

+1

योजना मैक्रोज़ बहुत शक्तिशाली हैं। मैंने कुछ समय पहले स्कीम मैक्रो के रूप में एक पूर्ण LINQ कार्यान्वयन लिखा था। [Https://ironscheme.svn.codeplex.com/svn/IronScheme/IronSchemeConsole/ironscheme/linq.ss](https://ironscheme.svn.codeplex.com/svn/IronScheme/IronSchemeConsole/ironscheme/linq.ss) इस सारी शक्ति के साथ, मैं इसे लागू करने के लिए अच्छे विचारों से बाहर निकल रहा हूं! – leppie

उत्तर

32

यह वास्तव में एक अच्छा सवाल है।

मुझे लगता है कि सूक्ष्म लेकिन निश्चित रूप से जवाबदेह है:

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

उदाहरण:

(loop for x from 0 below 100 
     when (even x) 
     collect x) 

कहा जा रहा है, सबसे सरल मैक्रो सिर्फ एस भाव का उपयोग करें। और आप उनका उपयोग करके "अटक" होंगे।

लेकिन सर्जीओ जैसे एस-एक्सप्रेशन ने उत्तर दिया है, सही महसूस करना शुरू कर दिया है। वाक्यविन्यास रास्ते से बाहर हो जाता है और आप सिंटैक्स पेड़ में कोडिंग शुरू करते हैं।

पाठक मैक्रो के लिए के रूप में, हाँ, आप क़यास कुछ इस तरह लिख सकते हैं:

#R{ 
     ruby.code.goes.here 
    } 

लेकिन आप अपने खुद के रूबी वाक्य रचना पार्सर लिखने की ज़रूरत होगी।

आप मौजूदा लिस्प संरचनाओं के संकलन वाले मैक्रोज़ के साथ ब्लॉक की तरह रूबी संरचनाओं की नकल भी कर सकते हैं।

#B(some lisp (code goes here)) 

अनुवाद करने के लिए

(lambda() (some lisp (code goes here))) 

इसे कैसे करना के लिए this page देखें होगा।

+1

मैक्रो का आपका उदाहरण "एस-एक्सप्रेशन में फंस नहीं गया" मेरे लिए एक एस-अभिव्यक्ति जैसा दिखता है। –

+12

लूप मैक्रो उदाहरण एक एस-एक्सप्रप्र है, लेकिन "सब-एक्सप्रेशन" नहीं हैं। –

+0

* यह वास्तव में एक अच्छा सवाल है। * लेकिन stackoverflow.com के लिए नहीं; यह कोई कार्य या कुछ भी नहीं है जिसका उत्तर निश्चित रूप से बिना किसी राय के धर्म और धर्म में घुसपैठ करने के लिए किया जा रहा है जहां विश्लेषण अनिश्चित समय के सिंक में बंद हो जाता है। – Kaz

2

यदि आप रूबी रूबी का उपयोग करने के लिए लिस्प चाहते हैं।

रुबी (और पायथन) का उपयोग बहुत ही कम तरीके से करना संभव है जो मुख्य कारणों में से एक है जिसे उन्होंने स्वीकृति प्राप्त की है।

1

@sparkes

कभी कभी लिस्प स्पष्ट भाषा विकल्प, अर्थात् Emacs एक्सटेंशन है। मुझे यकीन है कि अगर मैं चाहता था कि मैं Emacs को विस्तारित करने के लिए रूबी का उपयोग कर सकता हूं, लेकिन Emacs को LISP के साथ विस्तारित करने के लिए डिज़ाइन किया गया था, इसलिए ऐसा लगता है कि उस स्थिति में इसका उपयोग करना समझ में आता है।

0

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

+1

"उद्घाटन और समापन करने वाले माता-पिता को छोड़कर" <- आप इसे भी बदल सकते हैं। योजना के समकक्ष पाठक के समतुल्य योजना (रैकेट) में एम्बेड किए गए मानक एमएल के लिए http://planet.plt-scheme.org/package-source/chongkai/sml.plt/1/6/planet-docs/ml/index.html देखें मैक्रो। – p4bl0

10

नियमित मैक्रोज़ ऑब्जेक्ट्स की सूचियों पर काम करते हैं। आमतौर पर, ये वस्तुएं अन्य सूचियां होती हैं (इस प्रकार पेड़ बनाते हैं) और प्रतीकों, लेकिन वे स्ट्रिंग्स, हैशटेबल, उपयोगकर्ता परिभाषित ऑब्जेक्ट्स आदि जैसे अन्य ऑब्जेक्ट्स हो सकते हैं। इन संरचनाओं को s-exps कहा जाता है।

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

इसके अतिरिक्त, उपरोक्त पार्सिंग प्रक्रिया को "रीडर मैक्रोज़" के माध्यम से बढ़ाया जा सकता है जो आपको अपने कंपाइलर को एस-एक्सप में बदलने के तरीके को अनुकूलित करने देता है। हालांकि, मैं सुझाव देता हूं कि आप इसे किसी और चीज में झुकाव के बजाय लिस्प के वाक्यविन्यास को गले लगाओ।

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

बीटीडब्ल्यू, जब मैं लिस्प कहते हैं, मेरा मतलब Common Lisp है।

मेरा सुझाव है कि आप अपने पूर्वाग्रह दूर रखें और give Lisp an honest go

15

मैं एक लिस्प विशेषज्ञ नहीं हूं, बिल्ली मैं एक लिस्प प्रोग्रामर भी नहीं हूं, लेकिन भाषा के साथ प्रयोग करने के बाद मैं इस निष्कर्ष पर आया कि कुछ समय बाद ब्रांडेसिस 'अदृश्य' बनना शुरू कर देता है और आप शुरू करते हैं कोड को देखकर आप इसे देखना चाहते हैं। आप एस-एक्सप्रस और मैक्रोज़ के माध्यम से बनाई गई सिंटैक्टिकल संरचनाओं पर अधिक ध्यान देना शुरू करते हैं, और सूचियों और ब्रांड्स के पाठ के शब्दावली रूप से कम होते हैं।

यह विशेष रूप से सच है यदि आप एक अच्छे संपादक का लाभ उठाते हैं जो इंडेंटेशन और सिंटैक्स रंग के साथ मदद करता है (ब्रांड्स को पृष्ठभूमि के समान ही रंग में सेट करने का प्रयास करें)।

हो सकता है कि आप पूरी तरह से भाषा को प्रतिस्थापित करने और 'रूबी' वाक्यविन्यास प्राप्त करने में सक्षम न हों, लेकिन आपको इसकी आवश्यकता नहीं है। भाषा लचीलापन के लिए धन्यवाद, यदि आप चाहें तो एक ऐसी बोलीभाषा समाप्त हो सकती है जो आपको लगता है कि 'प्रोग्रामिंग की रूबी शैली' का पालन कर रहे हैं, जो भी आपको चाहिए।

मुझे पता है कि यह सिर्फ एक अनुभवजन्य अवलोकन है, लेकिन मुझे लगता है कि मुझे उन लिस्प ज्ञान ज्ञान क्षणों में से एक था जब मुझे यह एहसास हुआ।

5

हां, आप मौलिक रूप से वाक्यविन्यास बदल सकते हैं, और यहां तक ​​कि "कोष्ठक नरक" से बच सकते हैं। इसके लिए आपको एक नया पाठक वाक्यविन्यास परिभाषित करने की आवश्यकता होगी। पाठक मैक्रोज़ में देखो।

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

8

पैंथेसिस नरक?की तुलना में

(function toto) 

:: मैं में कोई और कोष्ठक देख

function(toto); 

और

में
(if tata (toto) 
    (titi) 
    (tutu)) 

नहीं की तुलना में अधिक:

if (tata) 
    toto(); 
else 
{ 
    titi(); 
    tutu(); 
} 

मैं कम कोष्ठक देख सकते हैं और ';' हालांकि।

+0

कुछ रूबी वाक्यविन्यास देखें ... आप पूरी तरह से माता-पिता को छोड़ सकते हैं जब तक कि उन्हें अस्पष्टता को दूर करने की आवश्यकता न हो ... यहां तक ​​कि हास्केल भी दृढ़ता से है कार्यात्मक लिस्प जैसे माता-पिता से बंधे नहीं हैं (या अन्य भाषाएं जिन्हें आप इंगित करते हैं) –

+1

@ माइक: आप सही हैं। लेकिन लिस्प बनाम सी/सी ++/जावा/सी #: इसमें इतना अधिक कंस्ट्रैसिस नहीं है, और बहुत कम ब्रैकेट और कोई अर्धचुंबक नहीं है! और वह 50 साल पहले था, यह हमेशा मुझे आश्चर्यचकित करता है। –

+0

कोई लिस्प में/पाठक लिख सकता है जो इंडेंटेशन का उपयोग करता है और माता-पिता की आवश्यकता नहीं होती है। यह कोड के एक पेज के बारे में होगा। क्या वह ज्यादा बदल जाएगा? यह उसकी दिखने के लिए एक पत्नी की तलाश की तरह है ... यद्यपि मूर्खतापूर्ण है कि, कई लोग ऐसा करते हैं ... :) –

19

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

आम लिस्प में उस वाक्यविन्यास को संसाधित करने के लिए पाठक और पाठक मैक्रोज़ के लिए नए वाक्यविन्यास को परिभाषित करने के लिए अंतर्निहित सुविधा है। यह प्रसंस्करण रीड-टाइम पर किया जाता है (जो संकलन या eval समय से पहले आता है)। कॉमन लिस्प में रीडर मैक्रोज़ को परिभाषित करने के बारे में अधिक जानने के लिए, सामान्य लिस्प हाइपरपेक देखें - आप Ch. 2, "Syntax" और Ch. 23, "Reader" पढ़ना चाहेंगे। (मेरा मानना ​​है कि योजना में एक ही सुविधा है, लेकिन मैं इसके बारे में परिचित नहीं हूं - Arc programming language के लिए Scheme sources देखें)।

एक साधारण उदाहरण के रूप में, मान लीजिए कि आप लिस्प को ब्रांड्स के बजाय घुंघराले ब्रेसिज़ का उपयोग करना चाहते हैं। यह निम्न पाठक परिभाषाओं की तरह कुछ की आवश्यकता है:

;; { and } become list delimiters, along with (and). 
(set-syntax-from-char #\{ #\() 
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do. 
    (declare (ignore inchar)) 
    (read-delimited-list #\} stream t)) 
(set-macro-character #\{ #'lcurly-brace-reader) 

(set-macro-character #\} (get-macro-character #\))) 
(set-syntax-from-char #\} #\)) 

;; un-lisp -- make parens meaningless 
(set-syntax-from-char #\) #\]) ; (and) become normal braces 
(set-syntax-from-char #\(#\[) 

आप लिस्प कह रहे हैं कि {एक तरह है (और है कि} है क)। फिर आप एक फ़ंक्शन (lcurly-brace-reader) बनाते हैं कि पाठक जब भी यह देखता है, तो कॉलर कॉल करेगा, और आप उस कार्य को {DATE को असाइन करने के लिए set-macro-character का उपयोग करते हैं। फिर आप लिस्प को बताते हैं कि (और) जैसे हैं [और] (यानी अर्थपूर्ण वाक्यविन्यास नहीं है)।

अन्य चीजें जो आप कर सकते हैं, उदाहरण के लिए, creating a new string syntax या इन-फ़िक्स नोटेशन को संलग्न करने और इसे एस-एक्सप्रेशन में संसाधित करने के लिए [और] का उपयोग करना शामिल है।

आप इससे भी आगे जा सकते हैं, पूरे वाक्यविन्यास को अपने स्वयं के मैक्रो वर्णों के साथ फिर से परिभाषित कर सकते हैं जो पाठक में कार्रवाइयों को ट्रिगर करेंगे, इसलिए आकाश वास्तव में सीमा है। यह Paul Graham और others कारणों में से एक कारण है कि लिस्प एक अच्छी भाषा है जिसमें एक कंपाइलर लिखना है।

14

बार-बार, लिस्प के नवागंतुक "सभी कोष्ठक से छुटकारा पाने" चाहते हैं। यह कुछ हफ्तों तक रहता है। सामान्य एस-अभिव्यक्ति पार्सर के शीर्ष पर एक गंभीर सामान्य उद्देश्य प्रोग्रामिंग वाक्यविन्यास बनाने के लिए कोई भी परियोजना कभी भी कहीं भी नहीं जाती है, क्योंकि प्रोग्रामर हमेशा आपको "कोष्ठक नरक" के रूप में समझते हुए पसंद करते हैं। इसमें थोड़ा सा उपयोग होता है, लेकिन ज्यादा नहीं! एक बार जब आप इसका उपयोग कर लेंगे, और आप वास्तव में डिफ़ॉल्ट वाक्यविन्यास की plasticity की सराहना कर सकते हैं, तो उन भाषाओं पर वापस जा सकते हैं जहां किसी विशेष प्रोग्रामिंग निर्माण को व्यक्त करने का केवल एक ही तरीका वास्तव में grating है।

कहा जा रहा है कि, लिस्प डोमेन विशिष्ट भाषाओं के निर्माण के लिए एक उत्कृष्ट सब्सट्रेट है। एक्सएमएल से बेहतर नहीं है, तो उतना ही अच्छा है।

शुभकामनाएं!

+0

ठीक है, मैं मानता हूं कि मैंने कभी भी विस्तारित समय के लिए लिस्प या बोलीभाषा का उपयोग नहीं किया है, लेकिन मैं वाक्यविन्यास का उपयोग करके काफी सहज हूं (और यह सादगी काफी शानदार है), लेकिन मैं अब भी किसी अन्य भाषा पर रुबी का वाक्यविन्यास पसंद करता हूं । –

+2

क्या होगा यदि सिंटैक्स कुछ भी हो सकता है जो आपको लगता है कि प्रोग्राम को हाथ में व्यक्त करने के लिए उचित था? – jfm3

+0

वास्तव में, किसी ने एस-एक्सप्रेशन के शीर्ष पर एक गंभीर सामान्य उद्देश्य प्रोग्रामिंग वाक्यविन्यास विकसित किया है - ["स्वीट-एक्सप्रेशन"] (http://www.dwheeler.com/readable/)। वे एस-एक्सप्रेशन के सभी लचीलापन फायदे को सुरक्षित रखते हैं। उस एक्सटेंशन के लिस्प-परिचित उपयोगकर्ता * * कोष्ठक नरक पसंद नहीं करते हैं "। हालांकि, स्वीट-एक्सप्रेशन पर पकड़ा नहीं गया है। मुझे लगता है कि ऐसा इसलिए है क्योंकि स्वीट-एक्सप्रेशन के लेखक ने केवल कुछ लिस्प बोलीभाषाओं के लिए सिंटैक्स लागू किया है, और उन एक्सटेंशन को इंस्टॉल करने के तरीके पर थोड़ा सा दस्तावेज़ लिखा है। –

1

कैसे पाठक मैक्रो एक्सएमएल templating की तरह जटिल कार्यों के साथ तुतलाना पाठक विस्तार कर सकते हैं की इस उदाहरण देखें:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

इस प्रयोक्ता पुस्तकालय UTF-8 शाब्दिक इनकोडिंग में एक्सएमएल के स्थिर भागों संकलित संकलन समय पर बाइट एरे जो नेटवर्क स्ट्रीम में लिखने के लिए तैयार हैं। और वे सामान्य लिस्पे मैक्रोज़ में प्रयोग योग्य हैं, वे ऑर्थोगोनल हैं ... अल्पविराम चरित्र की नियुक्ति प्रभाव जो भागों निरंतर हैं और जिन्हें रनटाइम पर मूल्यांकन किया जाना चाहिए।

अधिक जानकारी के यहां उपलब्ध है: http://common-lisp.net/project/cl-quasi-quote/

एक अन्य परियोजना है कि कॉमन लिस्प वाक्य रचना एक्सटेंशन के लिए: http://common-lisp.net/project/cl-syntax-sugar/

8

क्या आप पूछ रहे हैं, ताकि आप सभी कि नारकीय निकालने के तरीके का एक विशेषज्ञ चॉकलेट निर्माता बनने के लिए कहा जा रहा है कुछ हद तक है अपने पसंदीदा चॉकलेट केक से ब्राउन सामान।

0

मेरे दिमाग को उड़ाते हुए मैक्रोज़ के उपयोगों में से एक डीबी के खिलाफ एसक्यूएल अनुरोधों का संकलन-समय सत्यापन था।

एक बार जब आप महसूस करते हैं कि आपके पास संकलन समय पर पूरी भाषा है, तो यह दिलचस्प नए दृष्टिकोण खोलता है। जिसका अर्थ यह भी है कि आप अपने आप को दिलचस्प नए तरीकों से पैर में शूट कर सकते हैं (जैसे संकलन प्रतिपादन प्रतिलिपि नहीं करना, जो आसानी से डिबगिंग दुःस्वप्न में बदल सकता है)।

11

लिस्प मैक्रो मैंने कभी देखा है की सबसे अच्छा विवरण

https://www.youtube.com/watch?v=4NO83wZVT0A

में लगभग 55 मिनट पर शुरू में है। यह एक बात का एक वीडियो पीटर साइबल, "प्रैक्टिकल आम के लेखक द्वारा दिया गया नाम है लिस्प ", जो कि सबसे अच्छी लिस्प पाठ्यपुस्तक है।

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

आपने पूछा: "क्या आप LISP की कार्यात्मक प्रकृति को अधिक ऑब्जेक्ट उन्मुख वाक्यविन्यास और अर्थशास्त्र में बदल सकते हैं"। इसका जवाब है हाँ। असल में, लिस्प मूल रूप से कोई वस्तु-उन्मुख प्रोग्रामिंग नहीं था, आश्चर्य की बात नहीं है क्योंकि लिस्प ऑब्जेक्ट उन्मुख प्रोग्रामिंग से पहले ही आसपास रहा है! लेकिन जब हमने पहली बार 1 9 78 में ओओपी के बारे में सीखा, तो हम इसे अन्य चीजों, मैक्रोज़ के साथ आसानी से लिस्प में जोड़ने में सक्षम थे। आखिरकार कॉमन लिस्प ऑब्जेक्ट सिस्टम (सीएलओएस) विकसित किया गया था, एक बहुत शक्तिशाली ऑब्जेक्ट उन्मुख प्रोग्रामिंग सिस्टम जो लिस्प में सुंदरता से फिट बैठता है। पूरी चीज को विस्तार के रूप में लोड किया जा सकता है - कुछ भी अंतर्निहित नहीं है! यह सब मैक्रोज़ के साथ किया जाता है।

लिस्प में "रीडर मैक्रोज़" नामक एक पूरी तरह से अलग सुविधा है, जिसका उपयोग भाषा के सतह वाक्यविन्यास को बढ़ाने के लिए किया जा सकता है। पाठक मैक्रोज़ का उपयोग करके, आप ऐसे उपन्यास बना सकते हैं जिनमें सी-जैसे या रूबी जैसी वाक्यविन्यास हो। वे पाठ को आंतरिक रूप से लिस्प में बदल देते हैं। इन्हें अधिकांश वास्तविक लिस्प प्रोग्रामर द्वारा व्यापक रूप से उपयोग नहीं किया जाता है, मुख्य रूप से क्योंकि नए वाक्यविन्यास को समझने के लिए इंटरैक्टिव विकास पर्यावरण का विस्तार करना मुश्किल है। उदाहरण के लिए, Emacs इंडेंटेशन कमांड को एक नए वाक्यविन्यास द्वारा भ्रमित किया जाएगा। यदि आप ऊर्जावान हैं, हालांकि, Emacs भी एक्स्टेंसिबल है, और आप इसे अपने नए शब्दावली वाक्यविन्यास के बारे में सिखा सकते हैं।

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

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