2012-10-29 5 views
11

क्या कोई यह बता सकता है कि elisp में cl पैकेज का उपयोग करने के साथ विशिष्ट समस्याएं क्या हैं? Emacs में एक नया कोडर के रूप में मुझे लगता है कि जब भी मैं (आवश्यकता 'सीएल) विकल्प तक पहुंचता हूं तो मैं गलती कर रहा हूं। मैंने सीएल पैकेज के साथ बाइट-संकलन समस्या को पढ़ और समझ लिया है। मैंने पुराने तर्कों को देखा है और उन्हें पुनर्जीवित करने की कोई इच्छा नहीं है। मैं किसी भी सामान्य टिप्पणी की भी तलाश नहीं कर रहा हूं कि क्या एक्स-ब्रांड लिस्पी से सामान्य-लिस्प बेहतर है या नहीं।मैं elisp में सामान्य-lisp का सबसे अच्छा उपयोग कैसे करूं (यदि बिल्कुल)?

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

जवाब के कोने-कोने को सीमित करने की इच्छा के बिना

, यह है:

(mapcar (lambda(x) (* x x)) '(1 2 3)) 
ज्यादा इस की तुलना में अधिक स्वीकार्य

:

(require 'cl) 
(loop for el in '(1 2 3) collect (* el el)) 
+1

किसी भी व्यक्ति से कुछ टिप्पणी प्राप्त करना बहुत अच्छा होगा जो सामान्य-लिस्प पसंद नहीं करता है (या शायद कोई नहीं है और मिथक बस्टेड है)। –

+3

सीएल पैकेज आम-लिस्प नहीं है, इसलिए आप एक को पसंद कर सकते हैं और दूसरे को नापसंद कर सकते हैं। मुझे सीएल पैकेज की पेशकश के कई हिस्सों को पसंद है, लेकिन कई अन्य कारण हैं जो विभिन्न कारणों से समस्याग्रस्त हैं। Emacs-24.3 में नई 'cl-lib' लाइब्रेरी नामस्थान को साफ़ करती है ताकि अगर' cl-lib' अच्छा है या नहीं तो हमें परवाह करने की आवश्यकता नहीं है। सीएल I का हिस्सा सामान्य-लिस्प की विशेषताओं के साथ नहीं करना है जो "सरल दुभाषिया" कार्यान्वयन के लिए उपयुक्त नहीं हैं, इसलिए परिणामस्वरूप अप्रत्याशित प्रदर्शन लागत हो सकती है। (साथ ही कुछ विशेषताएं जिनके कार्यान्वयन त्रुटिपूर्ण हैं) – Stefan

उत्तर

8

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

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

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

4

क्या आपने मैनुअल के मैक्रोज़ section पढ़ा है? मैक्रोज़ का उपयोग करना जैसे कि loop उदाहरण पूरी तरह से ठीक है।

लेकिन आप आवश्यकता के आसपास eval-when-compile का उपयोग करेंगे।

वास्तव में (eval-when-compile (require 'cl)) मेरे Emacs में रूट लिस्प फ़ोल्डर में 66 बार दिखाई देता है।

+0

हां मैंने मैक्रो सेक्शन पढ़ा है, और पैकेज में कुछ मैक्रो कोड को देखा है। मैं अभी भी उस 'आह' पल का इंतजार कर रहा हूं जब मुझे कोई समस्या मिलती है जो _needs_ एक मैक्रो समाधान है। –

+0

कोई समस्या नहीं _needs_ एक मैक्रो समाधान। काफी कुछ मैक्रोज़ के साथ सरलीकृत किया जा सकता है। यह elisp के बजाय एक क्लोजर उदाहरण है, लेकिन मैंने एक जावा वर्ग के सभी स्थैतिक क्षेत्रों को निकालने के लिए एक मैक्रो लिखा है जो इसे अपने नामस्थान में बेनकाब करता है। मैक्रोज़ के बिना 'समाधान' बाइंडिंग को एक-एक करके लिखना होगा ... – Cubic

4

जब तक आप Emacs में अपना कोड एकीकृत करने की योजना नहीं बनाते हैं, तो CL पैकेज का उपयोग करें, और चेतावनियों को अक्षम करने के लिए इस स्निपेट को अपने .emacs में रखें।

(byte-compile-disable-warning 'cl-functions) 

ध्यान दें: आप nicferrier's blog पर elisp प्रोग्रामिंग पर कुछ सलाह मिल सकती है।

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