यदि आप लिस्प के कुछ पुराने मूल बातें सीखना चाहते हैं, तो Emacs Lisp ठीक है।
Emacs Lisp: Emacs में उपयोग किया जा सकता है। विकास पर्यावरण शामिल थे। मुख्यधारा लिस्प की पुरानी बोली। बहुत सारी अवधारणाओं को कम करता है। संपादक प्रोग्रामिंग के लिए कई एक्सटेंशन हैं। सामान्य लिस्प और Emacs Lisp कुछ प्रत्यक्ष विरासत साझा करें (नामकरण, अवधारणाओं, ...)।
आम लिस्प। से सीखने के लिए बहुत अच्छी किताबें। लिस्प अवधारणाओं (ओओ प्रोग्रामिंग समेत) के बहुत सारे सामान्य लिस्प के साथ सीखा जा सकता है। अत्यधिक सिफारिशित। सामान्य लिस्प में सबसे महत्वपूर्ण लिस्प सुविधाएं हैं और पुस्तकालय बाकी प्रदान करते हैं। वहां बड़ी मात्रा में सामान है जो इसके आसपास सीखा जा सकता है।
योजना: 70 के दशक में बनाई गई विभिन्न लिस्प बोलीभाषा। Emacs Lisp या Common Lisp के साथ सीधे संगत नहीं है। बहुत सारी उत्कृष्ट किताबें और अन्य ट्यूटोरियल सामग्री। लिस्प मूल बातें और कुछ और उन्नत चीजों को सीखने के लिए अत्यधिक अनुशंसा की जाती है। जितना गहरा आप योजना में खोदते हैं उतना ही यह इमाक्स लिस्प या यहां तक कि आम लिस्प से अलग दिखता है।
क्लोजर: बहुत अलग लिस्प बोलीभाषा। आम लिस्प, Emacs Lisp या योजना के साथ संगत नहीं है। कुछ अवधारणाओं को साझा करता है, कुछ अवधारणाएं अलग-अलग काम करती हैं। अच्छी किताबें। यदि आप कुछ लिस्प या विशेष रूप से क्लोजर सीखना चाहते हैं तो अनुशंसित। क्लोजर कार्यात्मक और समवर्ती प्रोग्रामिंग पर जोर देता है - बहुत प्रासंगिक विषय।
आप अधिक मुख्यधारा लिस्प (एक लिस्प कि एक नज़र और एक ठेठ लिस्प बोली के लग रहा है के साथ), मैं कॉमन लिस्प या योजना की सिफारिश करेंगे जानने के लिए चाहते हैं।
लिस्प सीखने के लिए मेरे भाषा वरीयता होगा (!):
- कॉमन लिस्प
- योजना
- Clojure
- Emacs लिस्प
आपको एक उदाहरण देता करने के लिए:
यह से मैककार्थी का लिस्प है, जो 1 9 60 में लिखा गया था (Lisp I Programmer's manual, 1960, पृष्ठ 101 से)। यह मूल रूप से कई लिस्प अभ्यास में FLATTEN
फ़ंक्शन है। यह एक नेस्टेड सूची लेता है और एक सूची में परमाणुओं के साथ एक नई सूची देता है।
DEFINE
(((COLLAPSE,(LAMBDA,(L),(COND,
((ATOM,L),(CONS,L,NIL))
((NULL,(CDR,L)),
(COND,((ATOM,(CAR,L)),L),(T,(COLLAPSE,(CAR,L)))))
(T,(APPEND,(COLLAPSE,(CAR,L)),(COLLAPSE,(CDR,L)))))
))))))
यह कॉमन लिस्प संस्करण है। आप इसे अपरकेस में रख सकते हैं या इसे लोअरकेस में बदल सकते हैं। दोनों काम करता है।
(DEFUN COLLAPSE (L)
(COND
((ATOM L) (CONS L NIL))
((NULL (CDR L))
(COND ((ATOM (CAR L)) L)
(T (COLLAPSE (CAR L)))))
(T (APPEND (COLLAPSE (CAR L))
(COLLAPSE (CDR L))))))
यह मूल रूप से वही है। कार्यों को परिभाषित करने के लिए केवल एक अलग नाम और वाक्यविन्यास है। अन्यथा कोड पूरी तरह से समान है।
CL-USER > (COLLAPSE '(((A B) ((C))) ((D (E F)) (G) ((H)))))
(A B C D E F G H)
यह चलाता है:
कॉमन लिस्प में मैककार्थी के उदाहरण की कोशिश करो।
अब जीएनयू एमएक्स का उपयोग करके Emacs Lisp में इसे आज़माएं।
ELISP> (defun collapse (l)
(cond
((atom l) (cons l nil))
((null (cdr l))
(cond ((atom (car l)) l)
(t (collapse (car l)))))
(t (append (collapse (car l))
(collapse (cdr l))))))
ELISP> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
यह बदलाव के बिना Emacs लिस्प में चलता है: Emacs लिस्प लोअरकेस पहचानकर्ता है।
आप योजना (मामूली नामांकन) में समान संस्करण प्राप्त कर सकते हैं:।
छोटा Chez योजना में
यहाँ:
> (define collapse
(lambda (l)
(cond
((atom? l) (cons l '()))
((null? (cdr l))
(cond ((atom? (car l)) l)
(else (collapse (car l)))))
(else (append (collapse (car l))
(collapse (cdr l)))))))
हम DEFINE
का उपयोग एक समारोह को परिभाषित कर सकते हैं। COND
थोड़ा अलग दिखता है। ()
खाली सूची है। भविष्यवाणी में ?
जोड़ा गया है।
> (collapse '(((a b) ((c))) ((d (e f)) (g) ((h)))))
(a b c d e f g h)
रन।
Clojure में यह अलग दिखेगा। असल में आपको बहुत सारे कोड पर पुनर्विचार करना होगा। - यह अभी भी अलग अलग विचार करेंगे
(defn flatten
[x]
(filter (complement sequential?)
(rest (tree-seq sequential? seq x))))
आप लिस्प संस्करण की भावना में एक flatten
लिख सकते हैं:
यह flatten
की Clojure के स्वयं के कार्यान्वयन है।
rosetta.org से:
(defn flatten [coll]
(lazy-seq
(when-let [s (seq coll)]
(if (coll? (first s))
(concat (flatten (first s)) (flatten (rest s)))
(cons (first s) (flatten (rest s)))))))
नाम अलग हैं, वाक्य रचना अलग है, अर्थ विज्ञान अलग है (सूचियों के बजाय आलसी दृश्यों पर काम करता है)।
बोलियाँ कॉमन लिस्प, Emacs लिस्प, दृश्य लिस्प, ISLISP और दूसरों की तरह विरासत रखने की कोशिश।
बोलियाँ योजना या Clojure जैसे नाम और वाक्य रचना करने के लिए बाध्य नहीं महसूस किया। उन्होंने विभिन्न दिशाओं में अभिनव किया। योजना अभी भी पुरानी कार्यक्षमता के प्रत्यक्ष संस्करण प्रदान करती है। क्लोजर नहीं करता है। क्लोजर प्रोग्रामर इसे एक नुकसान के रूप में नहीं देख पाएंगे।
* कार्यान्वित * आपके स्वयं के लिस्पस निश्चित रूप से अन्य लिस्पस सीखने में मदद करेंगे। –