Racket एक सामान्य-उद्देश्य प्रोग्रामिंग भाषा है जो Scheme की वंशज है, जो स्वयं Lisp की एक व्युत्पत्ति है। इसे प्रारंभ में भाषा निर्माण के लिए एक मंच के रूप में डिज़ाइन किया गया था, Racket डेवलपर्स को नई प्रोग्रामिंग भाषाएँ परिभाषित करने और नए विचारों का तेजी से प्रोटोटाइप बनाने के लिए उपकरणों का एक समृद्ध सेट प्रदान करता है। यह कार्यात्मक प्रोग्रामिंग पैराजाइम पर जोर देता है, और इसकी शक्तिशाली मैक्रो प्रणाली डोमेन-विशिष्ट भाषाओं के विकास में महत्वपूर्ण लचीलापन की अनुमति देती है। Racket विशेष रूप से शैक्षिक उद्देश्यों, अनुसंधान, और किसी भी एप्लिकेशन के लिए उपयुक्त है जिसमें कस्टम भाषा सुविधाएँ या व्यवहार की आवश्यकता होती है।
Racket (जिसे मूल रूप से PLT Scheme कहा जाता था) को 1990 के दशक के मध्य में नॉर्थईस्टर्न यूनिवर्सिटी के शोधकर्ताओं के एक समूह द्वारा बनाया गया था, जिसका नेतृत्व मैथ्यू फ्लैट ने किया था। इसे छात्रों को प्रोग्रामिंग और भाषा डिज़ाइन अवधारणाओं को सीखने में मदद करने के लिए एक शैक्षिक उपकरण के रूप में डिज़ाइन किया गया था, जो Lisp के Scheme उपभाषा के माध्यम से था। Racket के प्रारंभिक संस्करणों ने मुख्य रूप से प्रोग्रामिंग भाषाओं को सिखाने और सीखने के लिए एक मजबूत वातावरण प्रदान करने पर ध्यान केंद्रित किया।
आगामी वर्षों में, Racket अपने शैक्षिक मूल से विकसित हुआ, एक सामान्य-उद्देश्य प्रोग्रामिंग भाषा बन गया जिसमें एक विशिष्ट पहचान थी। PLT टीम ने 2010 में इसे Racket के रूप में पुनः ब्रांड किया, भाषा की बहुपरकारीता और कार्यात्मक, अनिवार्य, और वस्तु-उन्मुख प्रोग्रामिंग सहित विभिन्न पैराजाइम का समर्थन करने की क्षमता पर जोर दिया। Racket समुदाय बढ़ा, जिसमें शिक्षकों, शोधकर्ताओं, और सॉफ़्टवेयर डेवलपर्स के योगदान शामिल थे, जिसने भाषा डिज़ाइन और निष्पादन में इसकी क्षमताओं को मजबूत किया।
आज, Racket में एक समृद्ध पुस्तकालय और उपकरणों का सेट है, जिसमें DrRacket नामक एक शक्तिशाली एकीकृत विकास वातावरण (IDE) शामिल है। इसका डिज़ाइन नई भाषाओं के निर्माण को प्रोत्साहित करता है; इसलिए, इसका उपयोगकर्ता आधार पारंपरिक प्रोग्रामिंग उपयोग के मामलों से परे भाषा प्रयोग और विकास तक फैला हुआ है। Racket ने व्यापक प्रोग्रामिंग भाषा समुदाय में प्रभाव डाला है, जैसे कि Julia जैसी भाषाओं को प्रभावित किया और शैक्षिक प्रोग्रामिंग वातावरण में विकास को प्रभावित किया।
Racket पहले श्रेणी के फ़ंक्शनों का समर्थन करता है, जिससे फ़ंक्शनों को पहले श्रेणी के नागरिकों के रूप में माना जा सकता है। इसका मतलब है कि उन्हें तर्क के रूप में पास किया जा सकता है, अन्य फ़ंक्शनों से लौटाया जा सकता है, और चर में असाइन किया जा सकता है।
(define (apply-twice f x)
(f (f x)))
(apply-twice add1 5) ; 7 लौटाता है
Racket की शक्तिशाली मैक्रो प्रणाली व्याकरणिक विस्तार की अनुमति देती है, जिससे डेवलपर्स विशेष रूपों को बनाने में सक्षम होते हैं जो मूल भाषा में मौजूद नहीं होते।
(define-syntax-rule (when condition body)
(if condition
(begin body)))
(when (> 3 2)
(display "3 is greater than 2")) ; आउटपुट: 3 is greater than 2
Racket पैटर्न मिलान का समर्थन करता है match
के माध्यम से, जिससे डेटा को विघटित करते समय साफ और पठनीय कोड मिलता है।
(define (describe lst)
(match lst
[(list 0) "Zero"]
[(list n) (string-append "One: " (number->string n))]
[_ "Other"]))
Racket फ़ंक्शनों को वेरिएबल संख्या के तर्क स्वीकार करने की अनुमति देता है, जो कि त्रिपद चिह्न (ellipsis) सिंटैक्स का उपयोग करता है।
(define (sum . numbers)
(apply + numbers))
(sum 1 2 3 4) ; 10 लौटाता है
Racket में फ़ंक्शनों में वैकल्पिक और कीवर्ड तर्क हो सकते हैं, जो फ़ंक्शन हस्ताक्षर को परिभाषित करने में लचीलापन प्रदान करते हैं।
(define (greet #:name [name "World"])
(string-append "Hello, " name "!"))
(greet) ; "Hello, World!" लौटाता है
(greet #:name "Alice") ; "Hello, Alice!" लौटाता है
Racket अपने class
प्रणाली के माध्यम से वस्तु-उन्मुख प्रोग्रामिंग का समर्थन करता है, जिससे कक्षाएँ और विधियाँ बनाने की अनुमति मिलती है।
(define my-class
(class object%
(super-new)
(define/public (greet) "Hello!")))
(define obj (new my-class))
(send obj greet) ; "Hello!" लौटाता है
Racket पहले श्रेणी की निरंतरताओं को प्रदान करता है, जिससे डेवलपर्स को नियंत्रण प्रवाह को उन्नत तरीकों से प्रबंधित करने की अनुमति मिलती है।
(define (call-with-current-continuation f)
(call/cc f))
(call-with-current-continuation
(lambda (k) (k 10))) ; 10 लौटाता है
Racket में अंतर्निहित अनुबंध समर्थन है, जो डेवलपर्स को फ़ंक्शनों और संरचनाओं के अपेक्षित व्यवहार को निर्दिष्ट करने में मदद करता है।
(define/contract (safe-div x y)
(-> number? (and/c number? (not/c (= y 0))) number?)
(/ x y))
Racket कोड संगठन और पुन: प्रयोज्यता को सुविधाजनक बनाने के लिए एक मॉड्यूल प्रणाली का उपयोग करता है।
(module my-module racket
(define (hello) "Hello from my-module!"))
Typed Racket Racket का एक रूपांतर है जो स्थैतिक प्रकार जोड़ता है, विकास के दौरान प्रकार-चेकिंग को सक्षम बनाता है।
#lang typed/racket
(: add (-> Integer Integer Integer))
(define (add a b) (+ a b))
(add 2 3) ; 5 लौटाता है
DrRacket Racket के लिए प्राथमिक IDE के रूप में कार्य करता है, जो Racket प्रोग्राम लिखने और चलाने के लिए एक एकीकृत वातावरण प्रदान करता है। इसमें सिंटैक्स हाइलाइटिंग, डिबगिंग उपकरण, और इंटरैक्टिव प्रोग्रामिंग के लिए REPL (Read-Eval-Print Loop) जैसी सुविधाएँ शामिल हैं।
Racket में एक अंतर्निहित कंपाइलर है जो Racket कोड को बाइटकोड या मूल मशीन कोड में संकलित करता है ताकि कुशल निष्पादन हो सके। इसका रनटाइम सिस्टम मेमोरी, गारबेज संग्रहण, और अन्य निम्न-स्तरीय सिस्टम कार्यों का प्रबंधन करता है।
Racket परियोजनाएँ आमतौर पर कोड को मॉड्यूल में व्यवस्थित करने और बाहरी पुस्तकालयों के प्रबंधन के लिए Racket पैकेज प्रणाली का उपयोग करने में शामिल होती हैं। परियोजनाएँ raco
, Racket के कमांड-लाइन उपकरण का उपयोग करके बनाई जा सकती हैं, ताकि Racket फ़ाइलों को संकलित और चलाया जा सके।
raco make my-project.rkt
raco run my-project.rkt
Racket का उपयोग विभिन्न क्षेत्रों में किया जाता है, जिसमें शामिल हैं:
Racket विभिन्न प्रोग्रामिंग भाषाओं के साथ समानताएँ साझा करता है, जो इसके कार्यात्मक प्रोग्रामिंग जड़ों पर जोर देता है:
Racket के racket2cpp
जैसे उपकरण हैं जो Racket से C++ या समान भाषाओं में स्रोत-से-स्रोत अनुवाद की अनुमति देते हैं। इसके अतिरिक्त, कुछ शोध परियोजनाओं ने Racket को JavaScript या Python में अनुवाद करने पर ध्यान केंद्रित किया है, जिससे वेब अनुप्रयोगों या मौजूदा प्रणालियों के साथ आसान एकीकरण संभव हो सके।
मौजूदा स्रोत-से-स्रोत अनुवाद उपकरणों में शामिल हो सकते हैं:
Racket की लचीलापन और मजबूत मेटाप्रोग्रामिंग क्षमताएँ इसे भाषाएँ बनाने और नए प्रोग्रामिंग पैराजाइम का अन्वेषण करने के लिए एक उत्कृष्ट उम्मीदवार बनाती हैं। इसका समृद्ध इतिहास और सामुदायिक-प्रेरित विकास सुनिश्चित करता है कि यह शिक्षकों, शोधकर्ताओं, और सॉफ़्टवेयर डेवलपर्स के लिए एक मूल्यवान उपकरण बना रहे।