1) चर की एक नई अवधारणा। लिस्प में, सभी चर प्रभावी रूप से संकेत हैं। मान वे होते हैं जिनके प्रकार नहीं होते हैं, न कि चर और असाइन करने या बाँधने के लिए चर का अर्थ है कि वे किस ओर इशारा करते हैं।
(defun print-twice (it)
(print it)
(print it))
। यह ’एक चर है। यह किसी भी मूल्य के लिए बाध्य हो सकता है। चर के साथ कोई प्रतिबंध और कोई प्रकार जुड़ा नहीं है। यदि आप फ़ंक्शन को कॉल करते हैं, तो तर्क को कॉपी करने की आवश्यकता नहीं है। चर एक सूचक के समान है। यह वैरिएबल से बंधे मूल्य तक पहुंचने का एक तरीका है। मेमोरी को आरक्षित करने की कोई आवश्यकता नहीं है । जब हम फ़ंक्शन को कॉल करते हैं तो हम किसी भी डेटा ऑब्जेक्ट को पास कर सकते हैं: किसी भी आकार और किसी भी प्रकार का।
डेटा ऑब्जेक्ट में एक 'प्रकार' होता है और सभी डेटा ऑब्जेक्ट को इसके 'प्रकार' के लिए क्वियर किया जा सकता है।
(type-of "abc") -> STRING
2) एक प्रतीक प्रकार। प्रतीक इस बात से भिन्न होते हैं कि आप एक सूचक की तुलना करके समानता का परीक्षण कर सकते हैं।
एक प्रतीक नाम के साथ एक डेटा ऑब्जेक्ट है। आमतौर पर नाम का उपयोग वस्तु को खोजने के लिए किया जा सकता है:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
चूंकि प्रतीक वास्तविक डेटा ऑब्जेक्ट हैं, इसलिए हम परीक्षण कर सकते हैं कि क्या वे समान वस्तु हैं:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
यह हमें उदाहरण के लिए प्रतीकों के साथ एक वाक्य लिखने की अनुमति देता है:
(defvar *sentence* '(mary called tom to tell him the price of the book))
अब हम वाक्य में number की संख्या गिन सकते हैं:
(count 'the *sentence*) -> 2
आम लिस्प प्रतीकों में न केवल एक नाम है, बल्कि उनके पास एक मूल्य, एक फ़ंक्शन, एक संपत्ति सूची और एक पैकेज भी हो सकता है। तो प्रतीकों का उपयोग चर या कार्यों को नाम देने के लिए किया जा सकता है। संपत्ति सूची का उपयोग आमतौर पर प्रतीकों में मेटा-डेटा जोड़ने के लिए किया जाता है।
3) प्रतीकों के पेड़ों का उपयोग करके कोड के लिए एक संकेतन।
लिस्प कोड का प्रतिनिधित्व करने के लिए अपनी बुनियादी डेटा संरचनाओं का उपयोग करता है।
सूची (* 3 2) डेटा और कोड दोनों हो सकती है:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
पेड़:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) पूरी भाषा हमेशा उपलब्ध है। रीड-टाइम, संकलन-समय और रनटाइम के बीच कोई वास्तविक अंतर नहीं है। आप पढ़ते समय, कोड पढ़ते या चलाते समय कोड को कंपाइल या रन कर सकते हैं, और रनटाइम पर कोड को पढ़ या कंपाइल कर सकते हैं।
लिस्प, पाठ से डेटा और कोड पढ़ने के लिए READ, कोड लोड करने के लिए लोड, कोड का मूल्यांकन करने के लिए EVAL, कोड संकलन करने के लिए संकलन और डेटा और पाठ को लिखने के लिए PRINT प्रदान करता है।
ये फ़ंक्शन हमेशा उपलब्ध हैं। वे दूर नहीं जाते। वे किसी भी कार्यक्रम का हिस्सा हो सकते हैं। इसका मतलब है कि कोई भी प्रोग्राम - हमेशा लोड, इवल या प्रिंट कोड पढ़ सकता है।
वे C या Java जैसी भाषाओं में कैसे भिन्न हैं?
वे भाषाएं प्रतीक, कोड को डेटा या रनटाइम मूल्यांकन को कोड के रूप में प्रदान नहीं करती हैं। C में डेटा ऑब्जेक्ट आमतौर पर अप्रकाशित होते हैं।
क्या एलआईएसपी परिवार की भाषाओं के अलावा किसी अन्य भाषा के पास अभी इनमें से कोई भी निर्माण है?
कई भाषाओं में इनमें से कुछ क्षमताएं हैं।
अंतर:
लिस्प में इन क्षमताओं को भाषा में डिज़ाइन किया गया है ताकि वे उपयोग करने में आसान हों।