2012-03-02 18 views
22

तीन lispy homoiconic भाषाओं, Dylan, Julia और Seph सभी प्रमुख कोष्टक से दूर चले गए - तो कॉमन लिस्प में एक काल्पनिक समारोह कॉल कि ऐसा दिखाई देगा:क्लोजर डायलन, जूलिया और सेफ जैसे अग्रणी ब्रांड्स से दूर स्विच करके क्या खो देगा?

(print hello world) 

तरह निम्नलिखित काल्पनिक समारोह कॉल लग चाहेंगे

ऊपर वर्णित तीन भाषाओं में
print(hello world) 

इस मार्ग पर जाने के लिए क्लोजर थे - वहां पहुंचने के लिए उसे बलिदान देना होगा?

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

लेकिन यदि आपको अग्रणी ब्रांड्स की आवश्यकता नहीं है - तो उन्हें क्यों? केवल तर्क मैं उन्हें रखने के लिए के बारे में सोच सकते हैं

(1) Emacs में पुन: उपयोग उपकरण समर्थन

(2) लोग उत्साह 'लिस्प में लगता है' और कोशिश करते हैं और एक और प्रक्रियात्मक भाषा के रूप में यह इलाज नहीं करने के लिए)

+6

तुतलाना सौंदर्य का एक बड़ा हिस्सा तुच्छ parseability है और कोड के डेटा के रूप में प्रयोज्यता; आप उनमें से कुछ खो देंगे। – zmccord

+0

फ़ंक्शन एप्लिकेशन केवल कई संभावित रूपों में से एक है। क्या आप उन्हें अलग तरीके से इलाज करने का प्रस्ताव कर रहे हैं? Clojure पहले से ही एक भयानक चीज किया, विपक्ष कोशिकाओं को खत्म कर दिया। किसी भी भविष्य में जाने से पूरी तरह से भाषा बर्बाद हो जाएगी। –

+3

यह भी देखें http://stackoverflow.com/questions/643892/fixing-lisp-syntax। सवाल मुझे एक पास्कल डेवलपर की याद दिलाता है, मुझे पता था कि, जब सी का उपयोग करने का सामना करना पड़ा, तो मैक्रोज़ का एक सेट चाहता था जिसने सी को पास्कल की तरह बनाया। मुझे लगता है कि इसे हमेशा परेशान करने के लिए मजबूर कर कुछ नई चीज़ों के साथ अपनी असुविधा को कम करने का एक प्रलोभन होता है। और फिर भी कभी-कभी आपके लिए कुछ शर्तों से अलग होना अच्छा होता है। – user100464

उत्तर

13

लेखन मैक्रो और अधिक कठिन हो जाएगा क्योंकि संरचना अब सरल आप एक और तरीका है की आवश्यकता होगी एन्कोड करने के लिए जहां भाव शुरू करने और आप कर सकते हैं करने के लिए लिखने के शुरू और भाव का अंत करने के लिए कुछ वाक्यात्मक प्रतीक का उपयोग रोक होगा कोड है कि भाव उत्पन्न करता शायद आप इस समस्या को अभिव्यक्ति की शुरुआत चिह्नित करने के लिए एक ( की तरह कुछ जोड़कर the difference between familiar and easy पर lisps वाक्य रचना बनाने का समाधान कर सकता है ...

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

भले ही आप पूरी तरह से असहमत हों, वह वीडियो घंटे के बराबर है।

23

फ़ंक्शन कॉल के लिए केवल एक परमाणु कोष्ठक को स्थानांतरित करना किसी को संतुष्ट करने के लिए पर्याप्त नहीं होगा; लोग इंफिक्स ऑपरेटरों की कमी, प्रारंभ/अंत ब्लॉक आदि की कमी के बारे में शिकायत करेंगे। इसके अलावा आपको शायद सभी प्रकार के स्थानों में अल्पविराम/डिलीमीटर शुरू करना होगा।

उन्हें दें और मैक्रोज़ सही ढंग से लिखने के लिए बहुत कठिन होंगे (और संभवतः मैक्रोज़ लिखना कठिन होगा जो आपके द्वारा पेश किए गए सभी नए वाक्यविन्यास के साथ अच्छी तरह से दिखते हैं और कार्य करते हैं)। और मैक्रोज़ ऐसा कुछ नहीं है जो एक अच्छी सुविधा है जिसे आप अनदेखा कर सकते हैं या पूरी तरह से अधिक परेशान कर सकते हैं; पूरी भाषा (किसी अन्य लिस्प की तरह) उनके ऊपर सीधे बनाई गई है। क्लोजर.कोर में मौजूद "उपयोगकर्ता-दृश्यमान" सामग्री में से अधिकांश, चलो, def, defn आदि सहित मैक्रोज़ हैं।

+0

:) सहमत हैं कि आप लोगों को खुश नहीं कर सकते हैं। मुझे लगता है कि आप मैक्रोज़ रखेंगे, और मुझे लगता है कि आप कह रहे हैं "ठीक है आपको इन सभी कोर भाषा मैक्रोज़ को फिर से लिखना होगा"। लेकिन मुद्दा यह है कि किसी ने फैसला किया कि यह कम से कम तीन अलग-अलग भाषाओं पर इसके लायक था। मेरा सवाल क्यों नहीं था लेकिन क्या। – hawkeye

0
Were Clojure to go down this path - what would it have to sacrifice to get there? 

बलिदान भावना सूची की सूची की सूची बनाने के द्वारा कोड लिखने की/मानसिक मॉडल .. या अधिक तकनीकी रूप से "एएसटी सीधे लिख" होगा।

नोट: अन्य चीजें भी हैं जिन्हें अन्य उत्तरों में उल्लिखित के रूप में वर्णित किया जाएगा।

2

मैं सी/सी #/जावा/पास्कल कोड करता था इसलिए मैं इस भावना के साथ जोर देता हूं कि लिस्प कोड थोड़ा सा विदेशी है। हालांकि यह महसूस केवल कुछ हफ्तों तक चलता है - काफी कम समय के बाद लिस्प शैली बहुत स्वाभाविक महसूस करेगी और आप अपने "अनियमित" वाक्यविन्यास के लिए अन्य भाषाओं को बेरेट करना शुरू कर देंगे :-)

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

और जब आप कोड/मैक्रोज़ का उपयोग करते हैं, तो ये ये रूप हैं: ये आपके सभी कोड के बिल्डिंग ब्लॉक हैं। तो यह मौलिक रूप से कोष्ठक को उस स्थान पर रखने के लिए समझ में आता है जो फ़ॉर्म के बाहर पहले तत्व को मनमाने ढंग से छोड़ने के बजाय इन रूपों को बिल्कुल सीमित करता है।

1

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

:

यानी, Clojure में जिन परिस्थितियों में कोष्ठक गर्भित संभव हो रहे हैं है

  1. (पहले (बाकी (बाकी [1 2 3 4 5 6 7 8 9])))
  2. (-> [1 2 3 4 5 6 7 8 9] (बाकी) (आराम) (पहले))
  3. (-> [1 2 3 4 5 6 7 8 9 ] बाकी आराम करें)

ध्यान दें कि तीसरे में -> मैक्रो इस संदर्भ में ब्रांड्स को कम करने में सक्षम है और इस तरह उन्हें छोड़ देता है। इस तरह के कई विशेष मामले परिदृश्य हैं। सामान्य क्लोजर के डिजाइन में कम कोष्ठक के पक्ष में त्रुटि होती है। उदाहरण के लिए cond में पेरिस को छोड़ने का विवादास्पद निर्णय देखें। क्लोजर बहुत पसंद है और इस विकल्प के बारे में संगत है।

13

आपको कुछ भी बलिदान करने की आवश्यकता नहीं होगी। वहाँ david wheeler द्वारा एक बहुत ही ध्यान से सोच समझकर दृष्टिकोण है कि पूरी तरह से पारदर्शी और पीछे की ओर संगत है, मैक्रोज़ आदि के लिए पूर्ण समर्थन के साथ है

19

(एंड्रयू कुक का जवाब है, जो व्हीलर की के लिए लिंक प्रदान की और ग्लोरिया के "Readable Lisp S-expressions Project" को क्रेडिट) उपर्युक्त लिंक एक परियोजना है जिसका उद्देश्य स्कीम और क्लोजर समेत एस-एक्सप्रेशन के आधार पर सभी भाषाओं के लिए एक पठनीय वाक्यविन्यास प्रदान करना है। निष्कर्ष यह है कि यह किया जा सकता है: ब्रांड्स के बिना पठनीय लिस्प को पढ़ने का एक तरीका है।

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

  • घुंघराले-इन्फ़िक्स-भाव:

    इस परियोजना के तीन नए अभिव्यक्ति प्रकार परिभाषित करता है। (+ 1 2 3) हर जगह पर {1 + 2 + 3} बन जाता है जिसे आप किसी भी धर्मार्थ के इन्फिक्स ऑपरेटरों का उपयोग करना चाहते हैं। (एक विशेष मामला है जिसे देखभाल के साथ संभाला जाना चाहिए यदि इनलाइन अभिव्यक्ति कई ऑपरेटरों का उपयोग करती है, जैसे कि {1 + 2 * 3} - हालांकि {1 + {2 * 3}} अपेक्षा के अनुसार काम करता है)।

  • नियोटिक-अभिव्यक्तियां। (एफ x वाई) f (x y) (आवश्यक है कि फ़ंक्शन नाम और उसके पैरामीटर के बीच कोई स्थान नहीं रखा गया हो)
  • स्वीट-एक्सप्रेशन। माता-पिता को खोलना और बंद करना (वैकल्पिक) पायथन-जैसे अर्थपूर्ण इंडेंटेशन के साथ प्रतिस्थापित किया जा सकता है। स्वीट-एक्सप्रेशन को पारंपरिक ब्रांड्स एस-एक्सप्रेशन के साथ स्वतंत्र रूप से मिश्रित किया जा सकता है।

परिणाम लिस्प-अनुपालन लेकिन अधिक पढ़ने योग्य कोड है। कैसे नए वाक्यात्मक चीनी का एक उदाहरण को बढ़ाता है पठनीयता:

(define (gcd_ a b) 
    (let (r (% b a)) 
     (if (= r 0) a (gcd_ r a)))) 

(define-macro (my-gcd) 
    (apply gcd_ (args) 2)) 

हो जाता है:

define gcd_(a b) 
    let r {b % a} 
     if {r = 0} a gcd_(r a) 

define-macro my-gcd() 
    apply gcd_ (args) 2 

नोट कैसे वाक्य रचना मैक्रो, जिसके साथ एक समस्या थी के साथ संगत है previous projects that intended to improve Lisp syntax (व्हीलर और ग्लोरिया द्वारा बताया गया है) । चूंकि यह सिर्फ चीनी है, प्रत्येक नई अभिव्यक्ति का अंतिम रूप एक एस-अभिव्यक्ति है, जो मैक्रोज़ संसाधित होने से पहले भाषा पाठक द्वारा परिवर्तित किया जाता है - इसलिए मैक्रोज़ को किसी भी विशेष उपचार की आवश्यकता नहीं होती है। इस प्रकार "पठनीय लिस्प" परियोजना homoiconicity, संपत्ति है जो लिस्प को भाषा के भीतर डेटा के रूप में कोड का प्रतिनिधित्व करने की अनुमति देता है, जो कि यह एक शक्तिशाली मेटा प्रोग्रामिंग वातावरण होने की अनुमति देता है।

+2

यदि आप सभी को निकाल दिया गया है, तो उसने हमेशा मुझे मारा कि रैकेट (कई योजनाएं "भाषाओं" का समर्थन करने वाली एक योजना) इसे लागू करने के लिए एक अच्छी जगह होगी - https://en.wikipedia.org/wiki/Racket_features#Language_Extensions –

3

आपके पास गणित होगा। मैथमैटिका f[x, y, z] के रूप में फ़ंक्शन कॉल स्वीकार करता है, लेकिन जब आप इसकी जांच करते हैं, तो आप पाते हैं कि f[x, y, z] वास्तव में एक सूची के लिए वाक्य रचनात्मक चीनी है जिसमें Head (तत्व 0) f और Rest (तत्व 1 से एन) {x, y, z} है। आप सूचियों से फ़ंक्शन कॉल बना सकते हैं जो एस-एक्सप्रेशन की तरह दिखते हैं और आप सूचियों में अनियमित कार्यों को विघटित कर सकते हैं (Hold मूल्यांकन को रोकता है, लिस्प में quote की तरह)।

वहाँ मेथेमेटिका और लिस्प/योजना/Clojure के बीच अर्थ अंतर हो सकता है, लेकिन मेथेमेटिका के वाक्य रचना एक प्रदर्शन है कि आप एक परमाणु से अधिक छोड़ दिया कोष्टक स्थानांतरित कर सकते हैं और अभी भी यह समझदारी की व्याख्या, मैक्रो के कोड का निर्माण, आदि

है

सिंटेक्स प्रीप्रोसेसर (अर्थशास्त्र से कहीं अधिक आसान) के साथ कनवर्ट करना बहुत आसान है। आप शायद Clojure's LispReader के कुछ चालाक सबक्लासिंग के माध्यम से सिंटैक्स प्राप्त कर सकते हैं। यहां तक ​​कि a project भी है जो क्लोजर के ऑफ-डालने वाले कोष्ठक को स्क्वायर ब्रैकेट के साथ बदलकर हल करना चाहता है। (यह है कि यह एक बड़ी बात माना जाता है मेरे दिमाग boggles।)