लिस्प, "LISt Processing" का संक्षिप्त रूप, प्रोग्रामिंग भाषाओं का एक परिवार है जो एक विशिष्ट कोष्ठक-आधारित सिंटैक्स साझा करता है, जो मुख्य रूप से प्रतीकों और सूचियों के हेरफेर के चारों ओर केंद्रित है। यह उच्च-स्तरीय प्रोग्रामिंग भाषाओं में से एक है, जिसे मूल रूप से 1950 के दशक के अंत में आविष्कार किया गया था, और यह दशकों में काफी विकसित हुआ है। लिस्प विशेष रूप से इसकी शक्तिशाली विशेषताओं जैसे गतिशील टाइपिंग, गार्बेज कलेक्शन, और पहले श्रेणी के कार्यों के लिए जाना जाता है, जो इसे एआई अनुसंधान, प्रतीकात्मक गणना, और त्वरित प्रोटोटाइपिंग के लिए उपयुक्त बनाता है।
लिस्प का निर्माण जॉन मैकार्थी ने 1958 में कंप्यूटर प्रोग्रामों के लिए एक गणितीय नोटेशन और एआई को लागू करने के लिए एक व्यावहारिक साधन के रूप में किया था। यह भाषा लैम्ब्डा कलकुलस से निकली, जो गणितीय तर्क और कंप्यूटर विज्ञान में एक औपचारिक प्रणाली है। पहली कार्यान्वयन IBM 704 पर की गई थी, और जल्द ही कई बोलियाँ उभरीं, प्रत्येक ने अपनी विशेषताएँ और जटिलताएँ जोड़ीं।
समय के साथ लिस्प की कई उल्लेखनीय बोलियाँ उभरी हैं, जिनमें कॉमन लिस्प और स्कीम शामिल हैं। कॉमन लिस्प को 1980 के दशक में विभिन्न बोलियों को एकीकृत करने के लिए मानकीकृत किया गया, जबकि स्कीम, जो कार्यात्मक प्रोग्रामिंग और न्यूनतमवाद पर जोर देती है, ने अकादमी में लोकप्रियता हासिल की। लिस्प के प्रभाव को कई आधुनिक प्रोग्रामिंग भाषाओं में देखा जा सकता है, विशेष रूप से उन भाषाओं में जो कार्यात्मक प्रोग्रामिंग पैरेडाइम का समर्थन करती हैं, जैसे क्लोजर, रैकेट, और यहां तक कि पायथन और रूबी जैसी भाषाएँ।
आज, लिस्प सबसे लोकप्रिय प्रोग्रामिंग भाषाओं में से एक नहीं है, लेकिन यह विशेष रूप से अनुसंधान, एआई, और शिक्षा में प्रभावशाली बना हुआ है। समुदाय सक्रिय रूप से नए बोलियों का विकास कर रहा है जैसे कि क्लोजर, जो जावा वर्चुअल मशीन (JVM) पर चलता है और समवर्ती प्रोग्रामिंग पर ध्यान केंद्रित करता है।
लिस्प एक अद्वितीय सिंटैक्स का उपयोग करता है जिसमें कोष्ठक का उपयोग अभिव्यक्तियों को दर्शाने के लिए किया जाता है, जिसमें कोड को प्रतीकात्मक अभिव्यक्तियों (S-व्यक्तियों) में दर्शाया जाता है। उदाहरण के लिए:
(+ 1 2)
यह अभिव्यक्ति 1 और 2 का योग दर्शाती है।
लिस्प में कार्यों को तर्क के रूप में पास किया जा सकता है, अन्य कार्यों से लौटाया जा सकता है, और चर में असाइन किया जा सकता है:
(defun square (x) (* x x))
(mapcar #'square '(1 2 3 4)) ; लौटाता है (1 4 9 16)
लिस्प गतिशील रूप से टाइप किया गया है, जिससे चर किसी भी डेटा प्रकार के मानों को बिना पूर्व घोषणा के धारण कर सकते हैं:
(setq x 10) ; x अब एक संख्या है
(setq x "hello") ; x अब एक स्ट्रिंग है
लिस्प में शक्तिशाली मैक्रो सिस्टम हैं जो डेवलपर्स को कस्टम सिंटैक्स संरचनाएँ बनाने की अनुमति देते हैं:
(defmacro when (condition &body body)
`(if ,condition
(progn ,@body))
)
if
और cond
रूप लिस्प में नियंत्रण प्रवाह को सुविधाजनक बनाते हैं:
(if (> x 0)
(print "सकारात्मक")
(print "गैर-सकारात्मक"))
लिस्प सूचियों को मौलिक डेटा संरचनाओं के रूप में मानता है:
(setq my-list '(1 2 3 4))
(car my-list) ; लौटाता है 1
(cdr my-list) ; लौटाता है (2 3 4)
कार्य defun
निर्माण का उपयोग करके परिभाषित किए जाते हैं:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
कॉमन लिस्प में एक ऑब्जेक्ट-ओरिएंटेड सिस्टम शामिल है जिसे कॉमन लिस्प ऑब्जेक्ट सिस्टम (CLOS) कहा जाता है:
(defclass person ()
((name :initarg :name :accessor person-name)
(age :initarg :age :accessor person-age)))
(defmethod say-hello ((p person))
(format t "नमस्ते, मेरा नाम ~A है और मैं ~A वर्ष का हूँ."
(person-name p) (person-age p)))
लिस्प एक परिष्कृत त्रुटि प्रबंधन तंत्र प्रदान करता है जिसका उपयोग handler-case
द्वारा किया जाता है:
(handler-case
(/ 1 0)
(division-by-zero () (print "शून्य से भाग का सामना किया!")))
कुछ बोलियों में निरंतरताओं का समर्थन किया जाता है, जिससे प्रोग्राम को निष्पादन स्थितियों को सहेजने और पुनर्स्थापित करने की अनुमति मिलती है:
(call-with-current-continuation
(lambda (k)
(k 10)))
कई एकीकृत विकास वातावरण (IDEs) और कंपाइलर लिस्प प्रोग्रामिंग के लिए उपलब्ध हैं। लोकप्रिय विकल्पों में शामिल हैं:
एक लिस्प प्रोजेक्ट बनाने के लिए, आप आमतौर पर ".lisp" या ".lsp" एक्सटेंशन के साथ एक फ़ाइल बनाते हैं। SBCL का उपयोग करते हुए, एक सामान्य कार्यप्रवाह में आपके प्रोजेक्ट को REPL से लोड करना शामिल हो सकता है:
(load "my-project.lisp")
क्विकलिस्प का उपयोग करने वाले प्रोजेक्ट्स के लिए, एक लाइब्रेरी प्रबंधक के रूप में, निर्भरताएँ आसानी से प्रबंधित और लोड की जा सकती हैं।
लिस्प विशेष रूप से कृत्रिम बुद्धिमत्ता, प्रतीकात्मक गणना, और अकादमी में इसके अनुप्रयोगों के लिए जाना जाता है, लेकिन यह निम्नलिखित में भी उपयोग पाया जाता है:
लिस्प की अक्सर तुलना की जाती है:
लिस्प से अन्य भाषाओं में अनुवाद अक्सर स्रोत से स्रोत अनुवाद उपकरणों का उपयोग करके किया जाता है। उदाहरण के लिए, निम्नलिखित उपकरण मौजूद हैं:
इनमें से प्रत्येक उपकरण विशिष्ट मैपिंग प्रदान करता है जो सुनिश्चित करता है कि लिस्प की मूल कार्यक्षमताएँ लक्षित भाषाओं में प्रभावी रूप से प्रस्तुत की जा सकें। अधिक जटिल अनुवादों के लिए, मैनुअल रिफैक्टरिंग की आवश्यकता हो सकती है, विशेष रूप से भारी मैक्रो-ऑप्टिमाइज्ड कोड के लिए।