सी # देव - मैंने लिसप्स की कोशिश की है, लेकिन मुझे यह नहीं मिला [बंद]


37

कुछ महीनों के बारे में सीखने और लिस्प के साथ खेलने के बाद, दोनों सीएल और क्लोजर का एक सा, मैं अभी भी C # के बजाय इसमें कुछ भी लिखने के लिए एक सम्मोहक कारण नहीं देख रहा हूं।

मैं वास्तव में कुछ सम्मोहक कारणों को पसंद करूंगा, या किसी को यह बताने के लिए कि मैं वास्तव में कुछ बड़ा याद कर रहा हूं ।

लिस्प की ताकत (मेरे शोध के अनुसार):

  • कॉम्पैक्ट, अभिव्यंजक अंकन - C # से अधिक, हां ... लेकिन मुझे लगता है कि C # में भी उन विचारों को व्यक्त करने में सक्षम हो सकता हूं।
  • कार्यात्मक प्रोग्रामिंग के लिए निहित समर्थन - LINQ एक्सटेंशन विधियों के साथ C #:
    • मानचित्रकार =। चयन (लंबोदर)
    • mapcan =। चयन (लंबोदर) ।अगले ((a, b) => a.Union (b))
    • कार / पहली = .First ()
    • cdr / rest = .Skip (1) .... आदि।
  • लैम्ब्डा और उच्च-क्रम फ़ंक्शन समर्थन - C # में यह है, और सिंटैक्स यकीनन सरल है:
    • "(लंबो (x) (शरीर))" बनाम "x => (शरीर)"
    • क्लोजर में "" ("" "%", "% 1", "% 2") अच्छा है
  • विधि प्रेषण वस्तुओं से अलग - C # में विस्तार विधियों के माध्यम से है
  • मल्टीमिथोड प्रेषण - C # में यह मूल रूप से नहीं है, लेकिन मैं इसे कुछ घंटों में फ़ंक्शन कॉल के रूप में लागू कर सकता था
  • कोड डेटा (और मैक्रोज़) है - हो सकता है कि मैंने मैक्रोज़ को "प्राप्त" नहीं किया है, लेकिन मैंने एक भी उदाहरण नहीं देखा है जहां मैक्रो के विचार को एक फ़ंक्शन के रूप में लागू नहीं किया जा सकता है; यह "भाषा" नहीं बदलता है, लेकिन मुझे यकीन नहीं है कि यह एक ताकत है
  • डीएसएलएस - इसे केवल फ़ंक्शन कंपोजिशन के माध्यम से कर सकते हैं ... लेकिन यह काम करता है
  • अनकैप्ड "एक्सप्लोसिव" प्रोग्रामिंग - स्ट्रक्चर्स / क्लासेस के लिए, C # की ऑटोप्रॉपर्टीज़ और "ऑब्जेक्ट" काफी अच्छी तरह से काम करती हैं, और आप आसानी से मजबूत टाइपिंग में बढ़ सकते हैं जैसे आप साथ चलते हैं
  • गैर-विंडोज हार्डवेयर पर चलता है - हाँ, तो? कॉलेज के बाहर, मैंने केवल एक व्यक्ति को जाना है जो घर पर विंडोज नहीं चलाता है, या कम से कम विंडोज के एक वीएम पर * निक्स / मैक। (फिर फिर, शायद यह जितना मैंने सोचा था उससे अधिक महत्वपूर्ण है और मैं अभी दिमाग लगा रहा हूं ...)
  • बॉटम-अप डिज़ाइन के लिए REPL - ठीक है, मैं मानता हूं कि यह वास्तव में बहुत अच्छा है, और मैं इसे C # में याद करता हूं।

लिस्प में जो चीज़ें मुझे याद आ रही हैं (C #, .NET, विज़ुअल स्टूडियो, रेस्पर के मिश्रण के कारण):

  • नेमस्पेस। स्थैतिक तरीकों के साथ भी, मैं उन्हें उनके संदर्भ को वर्गीकृत करने के लिए एक "वर्ग" से बाँधना पसंद करता हूं (क्लजुरे को ऐसा लगता है, सीएल नहीं लगता है।)
  • महान संकलन और डिज़ाइन-टाइम समर्थन
    • प्रकार प्रणाली मुझे मेरे द्वारा पास किए गए डेटास्ट्रक्टर्स की "शुद्धता" निर्धारित करने की अनुमति देती है
    • कुछ भी गलत तरीके से रेखांकित किया जाता है; मुझे पता करने के लिए रनटाइम तक इंतजार करने की जरूरत नहीं है
    • कोड में सुधार (जैसे कि एक अनिवार्य के बजाय एक एफपी दृष्टिकोण का उपयोग करना) ऑटोस्गैस्टेड हैं
  • GUI विकास उपकरण: WinForms और WPF (मुझे पता है कि Clojure की जावा GUI पुस्तकालयों तक पहुंच है, लेकिन वे मेरे लिए पूरी तरह से विदेशी हैं।)
  • GUI डिबगिंग टूल: किसी भी स्तर पर कोड में कूदने की क्षमता के साथ ब्रेकपॉइंट, स्टेप-इन, स्टेप-ओवर, वैल्यू इंस्पेक्टर (टेक्स्ट, xml, कस्टम), घड़ियाँ, डिबग-बाय-थ्रेड, सशर्त ब्रेकप्वाइंट, कॉल-स्टैक विंडो ढेर में
    • (निष्पक्ष होने के लिए, Emacs + Slime के साथ मेरा कार्यकाल इस बारे में कुछ प्रदान करने के लिए लग रहा था, लेकिन मैं VS GUI द्वारा संचालित दृष्टिकोण के लिए आंशिक हूं)

मैं वास्तव में लिस्प के आसपास के प्रचार को पसंद करता हूं और मैंने इसे एक मौका दिया।

लेकिन क्या ऐसा कुछ है जो मैं लिस्प में कर सकता हूं जो मैं C # में भी नहीं कर सकता? यह C # में थोड़ा अधिक हो सकता है, लेकिन मेरे पास स्वतः पूर्ण है।

मुझे किसकी याद आ रही है? मुझे Clojure / CL का उपयोग क्यों करना चाहिए?


4
चूंकि आप पहले से ही एक कार्यात्मक शैली में प्रोग्रामिंग कर रहे हैं और ऐसा लगता है कि आप विंडोज के बुनियादी ढांचे पर काफी भरोसा करते हैं, इसलिए मैं आपको C # से बदलने के लिए कोई बाध्यकारी कारण नहीं देख सकता। मुझे पता है कि ज्यादातर लोग मैक या लिनक्स का उपयोग करते हैं, इसलिए आपके द्वारा चलाए जाने वाली भीड़ पर बहुत कुछ स्पष्ट रूप से निर्भर करता है (मैंने 3.1 के बाद से विंडोज के हर संस्करण का उपयोग किया है, लेकिन मैं अभी भी क्रॉस-प्लेटफॉर्म सॉफ्टवेयर और * nix सिस्टम के साथ काम करना पसंद करता हूं ... लेकिन फिर मैं किसी भी देशी जीयूआई काम, सभी सर्वरों और वेब UI सामान) ऐसा नहीं करते हैं
शॉन Corfield

2
आप पर्ल से पहले स्वाइन पर एक नज़र डाल सकते हैं । यह सुनने के लिए मजेदार बात है, और मैक्रों के लिए क्या अच्छा है इसका एक सरल उदाहरण प्रस्तुत करता है।
Matthias Benkard

4
"मैंने एक भी उदाहरण नहीं देखा है जहां मैक्रो के विचार को एक फ़ंक्शन के रूप में लागू नहीं किया जा सकता है" - मैं यह देखना चाहता हूं कि आप कैसे लिखते हैं ANDया ORफ़ंक्शन के रूप में। यह किया जा सकता है (दिया गया है LAMBDA, जो कि एक मैक्रो भी है) लेकिन मुझे ऐसा करने का कोई स्पष्ट तरीका नहीं दिख रहा है जो पूरी तरह से चूसना नहीं होगा।

1
"नेमस्पेस। ... क्लोजर के लिए ऐसा लगता है, सीएल नहीं लगता है" - क्या आप उस चीज के बारे में अधिक विशिष्ट हो सकते हैं जिसे आप खोज रहे हैं? मैंने वास्तव में क्लजुरे का उपयोग नहीं किया है, लेकिन इसके नाम स्थान सीएल के पैकेजों की तरह ही बहुत अच्छे लगते हैं।

4
जोनाथन: संकुल में नामकरण के लिए सीएल :(या ::अन-एक्सपोर्ट किए गए प्रतीकों के लिए) का उपयोग करता है, उदाहरण के लिए, यहां आपका उदाहरण उपयोग करेगा http:sessionऔर chat:session

जवाबों:


23

मैक्रों आपको अपनी भाषा के आराम को छोड़कर w / o कंपाइलर लिखने देते हैं। C # जैसी भाषाओं में डीएसएल आमतौर पर एक रनटाइम दुभाषिया की राशि होती है। आपके डोमेन के आधार पर, प्रदर्शन कारणों से समस्याग्रस्त हो सकता है। गति मायने रखती है , अन्यथा आप एक व्याख्या की गई भाषा में कोडिंग करेंगे और सी # नहीं।

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

इसलिए लिस्प आपको दक्षता के लिए एक मार्ग का त्याग करते हुए भाषा डिजाइन w / o में भाग लेने की अनुमति देता है । और जब ये मुद्दे आपके लिए मायने नहीं रखते हैं , तो वे बहुत महत्वपूर्ण हैं क्योंकि वे सभी उपयोगी उत्पादन-उन्मुख प्रोग्रामिंग भाषाओं की नींव रखते हैं। C # में यह मूलभूत तत्व बहुत ही सीमित रूप में आपके सामने उजागर होता है।

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

तो संक्षेप में, जो लोग आमतौर पर w / भाषाएँ करते हैं जैसे C # का निर्माण DSIL (डोमेन विशिष्ट व्याख्या की गई भाषाएँ) है। लिस्प आपको कुछ अधिक कट्टरपंथी, डीएसपी (डोमेन विशिष्ट प्रतिमान) बनाने का अवसर देता है। रैकेट (पूर्व में पीएलटी-स्कीम) इस संबंध में विशेष रूप से प्रेरणादायक है - उनके पास एक आलसी भाषा (लेज़ी रैकेट), एक टाइप्ड एक (टाइप्ड रैकेट), प्रोलॉग, और डॉग्स मैक्रोज़ के माध्यम से सभी एम्बेडेड मुहावरे हैं। ये सभी प्रतिमान समस्याओं के बड़े वर्गों के लिए शक्तिशाली समाधान प्रदान करते हैं - समस्याएँ जो सबसे अच्छा प्रोग्रामिंग प्रोग्रामिंग या एफपी प्रतिमानों द्वारा हल नहीं की जाती हैं।


3
उस तर्क के बारे में जो मुझे दिलचस्प लगता है वह यह है कि मैंने एक DSL (DSIL) को लागू करने के लिए कभी भी एक अवसर में (या इसे पूरी तरह से अपनी अज्ञानता में अनदेखा नहीं किया है) चलाया है। क्या आप डीएसएल की शक्ति पर विस्तार कर सकते हैं? (डेवलपर और उपयोगकर्ता दोनों के लिए।) यह ऐसा लगता है कि यह वास्तव में मुझे याद आ रही बड़ी बात हो सकती है।

15
@ जोनाथन मिटकेम, आप पहले से ही बहुत सारे बाहरी DSLs का उपयोग कर रहे हैं - कॉन्फ़िगरेशन फ़ाइलें, स्क्रिप्ट बनाएँ, ORM कॉन्फ़िगरेशन, विज़ुअल कोड जनरेटर (जैसे, winforms संपादक), XAML, पार्सर जनरेटर, आदि एम्बेडेड DSLs भी बेहतर हैं, जैसा कि आप डॉन। उनके लिए एक अलग बिल्ड टूल की जरूरत नहीं है, और वे एक ही भाषा में काम कर रहे हैं। और आपको कम से कम दो एम्बेडेड डीएसएल - नियमित अभिव्यक्ति और एसक्यूएल से परिचित होना चाहिए।
एसके-तर्क

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

2
@ जोनाथन मिटकेम, किसी भी उपकरण के साथ समस्या यह है कि किसी दिए गए उद्देश्य के लिए जरूरी नहीं है। आपको अलग-अलग कार्यों के लिए अलग-अलग टूल चुनना होगा। और लिस्प सहित किसी भी मेटा-भाषा की शक्ति यह है कि आपको किसी अन्य टूल पर पूरी तरह से स्विच करने की आवश्यकता नहीं है, क्योंकि आप अपनी मुख्य भाषा के शीर्ष पर अपने स्वयं के डोमेन-विशिष्ट टूल विकसित कर सकते हैं। मेरा सुझाव है कि आप नेमेर्ले पर एक नज़र डालें, इसे सी # डेवलपर के लिए समझना आसान होगा, और इसके मैक्रोज़ लगभग लिस्प के समान शक्तिशाली हैं।
एसके-लॉजिक

3
"मुझे एक टूल के साथ चिपकना पसंद है ..." लिस्प में उचित रूप से तैयार किए गए DSL ने कभी लिस्प की पूरी शक्ति को छिपाया नहीं है, इसलिए आपके पास अभी भी एक उपकरण है। वे सिर्फ एक तरह से शब्दावली में जोड़ते हैं जो एक विशेष डोमेन के लिए कोडिंग बनाता है अधिक प्राकृतिक "," बेहतर सार और समग्र संगठन के साथ।

15

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

कोड डेटा (और मैक्रोज़) है - शायद मैंने मैक्रोज़ को "प्राप्त नहीं" किया है, लेकिन मैंने एक भी उदाहरण नहीं देखा है जहां मैक्रो के विचार को एक फ़ंक्शन के रूप में लागू नहीं किया जा सकता है

हाँ, मैक्रोज़ मुश्किल से कर रहे हैं। सामान्य तौर पर मेट्रोपोग्रामिंग ग्रॉक के लिए कठिन है। यदि आपने किसी मैक्रो को देखा जिसे एक फ़ंक्शन के रूप में लागू किया जा सकता है, तो प्रोग्रामर इसे गलत कर रहा था। मैक्रो का उपयोग केवल तब किया जाना चाहिए जब कोई फ़ंक्शन काम नहीं करेगा।

एक मैक्रो का "हैलो वर्ल्ड" उदाहरण कॉन्ड के संदर्भ में "यदि" लिखना है। यदि आप वास्तव में मैक्रोज़ की शक्ति को जानने के इच्छुक हैं, तो क्लोजर में "my-if" को परिभाषित करने की कोशिश करें, फ़ंक्शन का उपयोग करें और देखें कि यह कैसे टूटता है। मेरे रहस्यमय होने का मतलब यह नहीं है, मैंने कभी भी किसी को मैक्रों को अकेले समझाना शुरू नहीं किया, लेकिन यह स्लाइड शो एक बहुत अच्छा परिचय है: http://www.slideshare.net/pcalcado/lisp-macros-in -20 मिनट-विशेषता-clojure प्रस्तुति

मेरे पास छोटी परियोजनाएँ हैं जहाँ मैंने मैक्रों का उपयोग करके कोड की शाब्दिक / हज़ारों पंक्तियों को बचाया (इसकी तुलना में कि यह जावा में क्या लिया होगा)। क्लोजर का अधिकांश भाग क्लोजर में लागू किया जाता है, जो कि स्थूल प्रणाली के कारण ही संभव है।


3
किसी भी कोड को छूने के बिना, मैं अपने सिर में मैक्रोज़ के बिना "अगर" को लागू करने के परिदृश्य के माध्यम से भागा, क्लोजर और सी # दोनों में। यह प्रभावी रूप से (या सचमुच) नहीं किया जा सकता है। मैं मानता हूं कि यह साफ-सुथरा है। लेकिन मुझे इस बात की याद आ रही है कि यह मेरे लिए कैसे उपयोगी है। मैक्रोज़ ("अगर" लिखने के अलावा) मैं क्या कर सकता हूँ जो मैं चतुर कार्यात्मक या OO- डिज़ाइन के साथ नहीं कर सकता हूँ? "यह मेरी मदद कैसे कर सकता है" भाषा के मूल्यांकन के लिए एक वैध मानदंड नहीं है, लेकिन यह मूल्यांकन करने के लिए है कि क्या मैं इसका उपयोग करूंगा। (मैं वास्तव में एक लिस्प चाहता हूं जो स्विच करने लायक हो, लेकिन यह एक व्यवहार्य विकल्प बनने की बात को हिट नहीं करता है।)

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

1
मैं मानता हूं कि मैक्रों सार्थक हैं, लेकिन यह सच नहीं है कि मेरी-यदि उन्हें आवश्यकता है, तो इसे उच्च-क्रम फ़ंक्शन (नीचे एक सीएल उदाहरण देखें) के रूप में लिखा जा सकता है। आपको केवल मैक्रोज़ की आवश्यकता है यदि आप कोड को चलना चाहते हैं या इसे एक नए शाब्दिक संदर्भ में रखना चाहते हैं। (defun my-if (test then &optional else) (cond (test (funcall then)) ('otherwise (funcall else))))

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

7
@ जोनाथन मिटकेम, LINQ सिंटैक्स मैक्रोज़ के साथ क्या किया जा सकता है, इसका एक अच्छा उदाहरण है, लेकिन इसके बजाय एक भाषा कोर में लागू किया जाना था, क्योंकि भाषा किसी भी सभ्य मेटाप्रोग्रामिंग का समर्थन नहीं करती है।
एसके-लॉजिक

14

मैं कॉमन लिस्प का विशेषज्ञ नहीं हूं, लेकिन मैं सी # और क्लोजर दोनों को यथोचित जानता हूं, इसलिए उम्मीद है कि यह एक उपयोगी परिप्रेक्ष्य है।

  • सिंपल सिंटैक्स => पावर - लिस्प सबसे सरल सिंटैक्स के बारे में है जो संभव काम कर सकता है। एस-एक्सप्रेशन आप सभी की जरूरत है। एक बार जब आप "(कॉल-कॉल arg1 arg2 arg3)" तो आप मूल रूप से मिल गया है। बाकी सिर्फ सही फ़ंक्शन कॉल और तर्क उठा रहा है। लगभग तुच्छ सरल लगता है, लेकिन तथ्य यह है कि यह सरलता वह है जो लिस्प्स को इतनी ताकत और लचीलापन देती है, और विशेष रूप से मेटा-प्रोग्रामिंग क्षमताओं को सक्षम करती है जो लिस्प के लिए प्रसिद्ध है। उदाहरण के लिए, यदि मैं एक ही तर्क पर कई अलग-अलग कार्यों को कॉल करने के लिए एक मैक्रो चाहता हूं, तो मैं सिर्फ निम्नलिखित की तरह कुछ करता हूं (न कि यह सिर्फ रनटाइम फ़ंक्शन एप्लिकेशन नहीं है - यह एक मैक्रो है जो संकलित कोड उत्पन्न करता है जैसे कि आपने सभी व्यक्तिगत फ़ंक्शन कॉल को लिखा था। हाथ से):
(defmacro print-many [functions args]  
  `(do   
     ~@(map   
        (fn [function] `(println (~function ~@args)))   
        functions)))

(print-many [+ - * /] [10 7 2])  
19  
1  
140  
5/7
  • अविश्वसनीय रूप से सरल वाक्य रचना के परिणामस्वरूप, लिस्प का "कोड डेटा है" फिलॉस्फी बहुत अधिक शक्तिशाली है जो आप फ़ंक्शन रचना / टेम्पलेट्स / जेनेरिक आदि के साथ कर सकते हैं। यह केवल डीएसएल से अधिक है, यह कोड-पीढ़ी और हेरफेर है, संकलन समय पर। , भाषा की मूलभूत विशेषता के रूप में। यदि आप सी # या जावा जैसी गैर- होमोसेक्सुअल भाषा में इस तरह की क्षमताएं प्राप्त करने का प्रयास करते हैं , तो आप अंततः लिस्प को बुरी तरह से समाप्त कर देंगे। इसलिए प्रसिद्ध ग्रीनस्पून दसवीं नियम: "किसी भी पर्याप्त रूप से जटिल सी या फोरट्रान कार्यक्रम में एक तदर्थ, अनौपचारिक रूप से निर्दिष्ट, बग-सवार, सामान्य लिस्प के आधे के धीमी गति से कार्यान्वयन शामिल है"। यदि आपने कभी अपने आवेदन के भीतर एक ट्यूरिंग-पूर्ण टेंपलेटिंग / प्रवाह नियंत्रण भाषा का आविष्कार करते हुए पाया है, तो आप शायद जानते हैं कि मेरा क्या मतलब है .....

  • संगामिति Clojure की एक अद्वितीय शक्ति (यहां तक कि अन्य Lisps के सापेक्ष) है, लेकिन अगर आपको लगता है कि प्रोग्रामिंग के भविष्य लिखने अनुप्रयोगों है कि अत्यधिक मल्टी कोर मशीनों के पैमाने, तो आप वास्तव में वास्तव में इस पर गौर करना चाहिए करने के लिए मतलब होगा - यह सुंदर है अभूतपूर्व। क्लोजर एसटीएम (सॉफ्टवेयर ट्रांजैक्शनल मेमोरी) काम करता है क्योंकि क्लोजर अपरिवर्तनीयता और लॉक-फ्री कॉन्सिरेबिलिटी का निर्माण करता है जो पहचान और राज्य के एक उपन्यास अलगाव पर आधारित है ( पहचान और राज्य पर रिच हिकी का उत्कृष्ट वीडियो देखें )। भाषा / रनटाइम वातावरण पर इस प्रकार की संगामिति क्षमता को नियंत्रित करना बहुत दर्दनाक होगा जहां एपीआई का एक महत्वपूर्ण अनुपात उत्परिवर्तनीय वस्तुओं पर काम करता है।

  • कार्यात्मक प्रोग्रामिंग - लिस्प्स उच्च क्रम के कार्यों के साथ प्रोग्रामिंग पर जोर देते हैं। आप सही हैं कि इसे OO ऑब्जेक्ट्स में बंद / फ़ंक्शन ऑब्जेक्ट्स आदि के साथ अनुकरण किया जा सकता है, लेकिन अंतर यह है कि संपूर्ण भाषा और मानक लाइब्रेरी आपको इस तरह से कोड लिखने में मदद करने के लिए डिज़ाइन की गई है। उदाहरण के लिए, क्लोजर अनुक्रम आलसी हैं , इसलिए आपके ArrayLists या C # / Java में HashMaps के विपरीत असीम रूप से लंबे हो सकते हैं। यह कुछ एल्गोरिदम को व्यक्त करने के लिए बहुत आसान बनाता है , उदाहरण के लिए निम्न में से किसी एक की सूची को अलग करता है:

    (def fibs (lazy-cat '(0 1) (map + fibs (drop 1 fibs))))

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

  • इंटरएक्टिव विकास - वास्तव में मुझे लगता है कि आप C # 4.0 के लिए किसी प्रकार का REPL प्राप्त कर सकते हैं, लेकिन लिस्प में यह एक नवीनता के बजाय मानक अभ्यास है। आपको एक संकलन / निर्माण / परीक्षण चक्र बिल्कुल नहीं करना है - आप अपना कोड सीधे चल रहे वातावरण में लिखते हैं, और बाद में इसे अपने स्रोत फ़ाइलों में कॉपी कर लेते हैं। यह आपको कोड करने का एक बहुत अलग तरीका सिखाता है, जहां आप तुरंत परिणाम देखते हैं और अपने समाधान को पुन: परिष्कृत करते हैं।

"गायब" के रूप में आपके द्वारा देखी जाने वाली चीजों पर कुछ त्वरित टिप्पणियां:

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

मैं व्यक्तिगत रूप से क्लीजुर / लिस्प सुंदर सम्मोहक के फायदे पाता हूं, और मैं सी # / जावा पर वापस जाने की योजना नहीं बना रहा हूं (इससे परे मुझे सभी उपयोगी पुस्तकालयों को उधार लेने की आवश्यकता है!)।

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


1
विचारों की महान गणना के लिए धन्यवाद। मैं वास्तव में IEnumerable <> C # में निर्माण के माध्यम से बहुत आलसी दृश्यों का उपयोग करता हूं (और 2005 या उसके बाद किसी ArrayList को नहीं छुआ है) लेकिन मैं इस विचार को समझता हूं। क्लोजर की संगामिति आदिम बेहद प्रभावशाली हैं। मैं कुछ साल पहले C # में ग्रिड कंप्यूटिंग कर रहा था - कई मल्टी-कोर मशीनों में समरूपता - और मुझे अभी भी विश्वास है कि भविष्य है। संभवतः सबसे बड़ा विचार जो मैंने सभी से प्राप्त किया है, "आपको वास्तव में बस खोदना है और इसे अनुभव करना है, इसे वास्तव में समझाया नहीं जा सकता है"। इसलिए, मैं खुदाई करता रहूंगा और अनुभव करता रहूंगा।

1
कूल, मदद करने के लिए खुश है - और यह बिल्कुल सही भावना है !!
मिकेरा

10

सी # में बहुत सारी विशेषताएं हैं, लेकिन मिश्रण अलग महसूस करता है। कुछ भाषा में एक विशेषता है, इसका मतलब यह नहीं है कि इसका उपयोग करना आसान है, प्रतिमान और बाकी भाषा के साथ अच्छी तरह से एकीकृत है।

आम लिस्प में यह मिश्रण है:

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

अब, अन्य भाषाओं, जैसे C #, के पास भी है। लेकिन अक्सर एक ही जोर के साथ नहीं।

सी # है

  • सी जैसे सिंटेक्स
  • कुछ एफपी सुविधाओं के साथ ज्यादातर अनिवार्य वस्तु-उन्मुख
  • सांख्यिकीय रूप से टाइप किया गया
  • ज्यादातर बैच बैच संकलक के साथ उपयोग करते हैं
  • कचरा संग्रह के साथ स्मृति का प्रबंधन किया

यह मदद नहीं करता है कि C # में उदाहरण के लिए कोड हेरफेर विशेषताएं हैं, यदि उन्हें लिस्प में व्यापक रूप से उपयोग नहीं किया जाता है। लिस्प में आपको कई सॉफ्टवेयर नहीं मिलेंगे जो सभी प्रकार के सरल और जटिल तरीकों से मैक्रोज़ का भारी उपयोग नहीं करते हैं। कोड हेरफेर का उपयोग करना वास्तव में लिस्प में एक बड़ी विशेषता है। कुछ उपयोगों का अनुकरण करना कई भाषाओं में संभव है, लेकिन यह लिस्प की तरह एक केंद्रीय विशेषता नहीं है। उदाहरणों के लिए 'ऑन लिस्प' या 'प्रैक्टिकल कॉमन लिस्प' जैसी किताबें देखें।

संवादात्मक विकास के लिए भी। यदि आप एक बड़े CAD सिस्टम को विकसित करते हैं, तो अधिकांश विकास संपादक और REPL से इंटरएक्टिव होगा - सीधे चल रहे CAD एप्लीकेशन में। आप सी # या अन्य भाषाओं में इसका अधिक अनुकरण कर सकते हैं - अक्सर एक विस्तार भाषा को लागू करके। लिस्प के लिए यह परिवर्तन जोड़ने के लिए विकास के तहत सीएडी आवेदन को फिर से शुरू करना बेवकूफी होगी। सीएडी सिस्टम में तब एक संवर्धित लिस्प भी शामिल होगा जिसमें सीएडी ऑब्जेक्ट्स और उनके संबंधों (पार्ट-इन, निहित, ...) का वर्णन करने के लिए भाषा सुविधाएँ (मैक्रोज़ और प्रतीकात्मक विवरण के रूप में) शामिल होंगी। C # में समान कार्य कर सकता है, लेकिन लिस्प में यह डिफ़ॉल्ट विकास शैली है।

यदि आप एक संवादात्मक विकास प्रक्रिया का उपयोग करके जटिल सॉफ़्टवेयर विकसित करते हैं या आपके सॉफ़्टवेयर में पर्याप्त प्रतीकात्मक भाग (मेटा प्रोग्रामिंग, अन्य प्रतिमान, कंप्यूटर बीजगणित, संगीत रचना, योजना, ...) है, तो लिस्प आपके लिए हो सकता है।

यदि आप विंडोज वातावरण में काम करते हैं (मैं नहीं), तो C # का एक फायदा है, क्योंकि यह Microsoft की एक मुख्य विकास भाषा है। Microsoft किसी भी रूप Lisp का समर्थन नहीं करता है।

तुम लिखो:

  • नेमस्पेस। स्थैतिक तरीकों के साथ भी, मैं उन्हें उनके संदर्भ को वर्गीकृत करने के लिए एक "वर्ग" से बाँधना पसंद करता हूं (क्लजुरे को ऐसा लगता है, सीएल नहीं लगता है।)

सामान्य लिस्प कक्षाओं में नामस्थान संलग्न नहीं करता है। नामस्थान प्रतीक पैकेज द्वारा प्रदान किए जाते हैं और कक्षाओं से स्वतंत्र होते हैं। यदि आप CLOS का उपयोग करते हैं, तो आपको ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए अपने दृष्टिकोण को फिर से बनाने की आवश्यकता है।

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

लिस्प संकलक का उपयोग करें। यह आपको अज्ञात चरों के बारे में सूचित करता है, हो सकता है कि स्टाइल सिफारिशें हों (उपयोग किए गए कंपाइलर के आधार पर), दक्षता संकेत देती है, ... कंपाइलर एक कीस्ट्रोक है।

  • GUI विकास उपकरण: WinForms और WPF (मुझे पता है कि Clojure की जावा GUI पुस्तकालयों तक पहुंच है, लेकिन वे मेरे लिए पूरी तरह से विदेशी हैं।)

लिस्वर्डवर्क्स और एलेग्रो सीएल जैसे वाणिज्यिक लिस्प्स विंडोज के तहत समान चीजें पेश करते हैं।

  • GUI डिबगिंग टूल: किसी भी स्तर पर कोड में कूदने की क्षमता के साथ ब्रेकपॉइंट, स्टेप-इन, स्टेप-ओवर, वैल्यू इंस्पेक्टर (टेक्स्ट, xml, कस्टम), घड़ियाँ, डिबग-बाय-थ्रेड, सशर्त ब्रेकप्वाइंट, कॉल-स्टैक विंडो स्टैक में (निष्पक्ष होने के लिए, Emacs + Slime के साथ मेरा कार्यकाल इस में से कुछ प्रदान करने के लिए लग रहा था, लेकिन मैं वीएस जीयूआई-संचालित दृष्टिकोण के लिए आंशिक हूं)

LispWorks और Allegro CL जैसे कमर्शियल लिस्प्स विंडोज के तहत सभी प्रदान करते हैं।


1
मेरी आलोचना वास्तव में लिस्प्स की नहीं है। मुझे लगता है कि वे काफी सक्षम हैं। मैं देख रहा हूँ कि एक लिस्प क्या कर सकता हूँ / मुझे दे दो जो मैं पहले से नहीं करता। मैं पूरी तरह से समझता हूं कि अधिकांश सी # देवता "नई" भाषा की कई विशेषताओं का उपयोग नहीं करते हैं। मुझे लगता है कि बड़ा बिंदु यह है कि मैं करता हूं, और ईमानदारी से, जीयूआई के बाहर, मैं लगभग 100% एफपी शैली में लिखता हूं। एफपी एक वैचारिक छलांग थी, लेकिन इसके लायक था। हालांकि, एक लिस्प में स्विच करना, जहां से मैं थोड़ा लाभ प्रदान करता हूं। मैं यह खोजने की उम्मीद कर रहा हूं कि एक कारण है कि मुझे इसे एक मौका देना चाहिए।

@ जोनाथन मिटकेम: सी # वास्तव में एक एफपी भाषा की तरह नहीं दिखता है, भले ही भाषा में कुछ विशेषताएं हैं जो इसका समर्थन करती हैं और कुछ पुस्तकालय उन का उपयोग कर सकते हैं। यदि आप Microsoft इको-सिस्टम में FP प्रोग्रामिंग करना चाहते हैं, तो F # आपके लिए हो सकता है।

@ रेनर नहीं, यह एक एफपी भाषा की तरह नहीं दिखता है, लेकिन यह यह कर सकता है, और उस पर काफी कॉम्पैक्ट रूप से। और जब मुझे अत्यावश्यक कोड, या OO चाहिए, तो मैं भी कर सकता हूं। (थोड़ा दूर का विषय: मैं वास्तव में एफ # एक गंभीर भाषा में खुदाई करने के लायक नहीं समझता, मैं अपने सिर हास्केल में मठों के आसपास प्राप्त करूंगा। लेकिन जब मैं सी ++ देव था और सी # बाहर आया था, तो मैंने इस पर विचार नहीं किया। एक "वास्तविक" भाषा [और वापस तो यह नहीं था, imho])

@Rainer यहाँ सी # में एफपी का एक उदाहरण है jmitchem.livejournal.com/#post-jmitchem-69978 भी jmitchem.livejournal.com/?skip=10#post-jmitchem-66618

@ जोनाथन मिटकेम: मुझे क्यों देखना चाहिए? मैंने लिखा है कि C # कुछ FP फीचर्स को सपोर्ट करता है। यह सिर्फ एक अनिवार्य वस्तु-उन्मुख भाषा में जोड़ा गया है और इसे मुहावरेदार नहीं बनाता है, जैसा कि कहते हैं, लिस्प, स्कीम और विशेष रूप से एसएमएल, एफ #, हास्केल या अन्य मुख्य रूप से कार्यात्मक भाषाओं की तुलना में नहीं। मेरा कहना है: सी # में कुछ एफपी संभव है, लेकिन यह एक मुख्य विशेषता नहीं है।

5

रेनियर जोसविग ने इसे बेहतरीन बताया।

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

लिस्प अलग दिखता है, इसका उपयोग अलग-अलग किया जाता है, इसका उपयोग करते समय एक अलग तरीके से प्रोग्रामिंग का उपयोग किया जाता है। यह सुरुचिपूर्ण, पूर्ण, बड़ा और निर्बाध है। यह अपने स्वयं के blemishes और peccadilloes के बिना नहीं है। निश्चित रूप से अन्य भाषाओं से तुलना की जा सकती है जो कि जहाँ संभव हो वहाँ से आगे नहीं निकल सकती हैं। लेकिन किसी भी तरह से लिस्प सिर्फ भाषा एक्स प्लस आरईपीएल और मैक्रोज़, या भाषा वाई प्लस बहु-विधि प्रेषण और पुनरारंभ नहीं है।


3
कोड डेटा (और मैक्रोज़) है - हो सकता है कि मैंने मैक्रोज़ को "प्राप्त" नहीं किया है, लेकिन मैंने एक भी उदाहरण नहीं देखा है जहां मैक्रो के विचार को एक फ़ंक्शन के रूप में लागू नहीं किया जा सकता है; यह "भाषा" नहीं बदलता है, लेकिन मुझे यकीन नहीं है कि यह एक ताकत है

आमतौर पर, एक मैक्रो का उपयोग किसी ऐसी चीज के लिए किया जाना चाहिए जो फ़ंक्शन कॉल के रूप में व्यक्त नहीं होती है। मुझे नहीं पता कि C # में स्विच जैसी स्थिति है या नहीं (C में मौजूद समान के रूप में, स्विच (फ़ॉर्म) {केस ...}), लेकिन हमें यह मान लेना चाहिए और उसी प्रतिबंध के पास है ( एक अभिन्न प्रकार की आवश्यकता होती है)।

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

हालांकि यह व्यक्त करना संभव हो सकता है कि एक फ़ंक्शन (तुलना स्ट्रिंग, मामलों की एक सूची और निष्पादित करने के लिए बंद) के रूप में, यह संभवतः "सामान्य कोड" जैसा नहीं लगेगा और यहीं पर लिस्प मैक्रोज़ की निश्चित जीत है। आप शायद काफी कुछ मैक्रो या विशेष रूपों taht स्थूल की तरह, की तरह हैं का उपयोग किया है defun, defmacro, setf, cond, loopऔर कई और अधिक।


2

यह सबसे अच्छा व्याख्यात्मक लेख है जो मैंने पाया है कि पाठक को लिस्प की वकालत की सतह से ले जाता है कि अवधारणाओं का कुछ गहरा प्रभाव दिखाने के लिए:

http://www.defmacro.org/ramblings/lisp.html

मुझे याद है कि कहीं और इस तरह से एक विचार पढ़ना: अन्य भाषाओं ने लिस्प की विभिन्न विशेषताओं को अपनाया है; कचरा संग्रह, गतिशील टाइपिंग, अनाम फ़ंक्शन, बेहतर C ++ / C / Algol का उत्पादन करने के लिए बंद होता है। हालाँकि लिस्प की पूरी शक्ति पाने के लिए आपको इसकी सभी आवश्यक विशेषताओं की आवश्यकता है, जिस बिंदु पर आपको लिस्प की एक और बोली है, भाषाओं का एक अलग परिवार जो लगभग 50 वर्षों से एक या किसी अन्य रूप में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.