راکت یک زبان برنامهنویسی چندمنظوره است که از زبان اسکیما (Scheme) نشأت گرفته و خود از زبان لیسپ (Lisp) مشتق شده است. این زبان در ابتدا به عنوان یک پلتفرم برای ایجاد زبانهای جدید طراحی شده بود و مجموعهای غنی از ابزارها را برای توسعهدهندگان فراهم میکند تا زبانهای برنامهنویسی جدیدی تعریف کرده و ایدههای جدید را به سرعت پروتوتایپ کنند. راکت بر پارادایمهای برنامهنویسی تابعی تأکید دارد و سیستم ماکرو قدرتمند آن انعطافپذیری قابل توجهی را در توسعه زبانهای خاص دامنه فراهم میکند. راکت بهویژه برای اهداف آموزشی، تحقیقاتی و هر برنامهای که نیاز به ویژگیها یا رفتارهای خاص زبانی دارد، مناسب است.
راکت (که در ابتدا PLT Scheme نامیده میشد) توسط گروهی از محققان در دانشگاه نورثایسترن در اواسط دهه 1990 به رهبری متیو فلت ایجاد شد. این زبان به عنوان ابزاری آموزشی طراحی شده بود تا به دانشآموزان در یادگیری مفاهیم برنامهنویسی و طراحی زبان از طریق گویش اسکیما کمک کند. نسخههای اولیه راکت عمدتاً بر ارائه یک محیط قوی برای آموزش و یادگیری زبانهای برنامهنویسی تمرکز داشتند.
در سالهای بعد، راکت فراتر از ریشههای آموزشی خود تکامل یافت و به یک زبان برنامهنویسی چندمنظوره با هویتی متمایز تبدیل شد. تیم PLT در سال 2010 آن را به نام راکت بازنشانی کرد و بر تنوع و قابلیتهای آن در پشتیبانی از پارادایمهای مختلف، از جمله برنامهنویسی تابعی، دستوری و شیگرا تأکید کرد. جامعه راکت رشد کرد و با مشارکتهای معلمان، محققان و توسعهدهندگان نرمافزار، قابلیتهای آن در طراحی و اجرای زبان تقویت شد.
امروزه، راکت مجموعهای غنی از کتابخانهها و ابزارها را شامل میشود، از جمله یک محیط توسعه یکپارچه (IDE) قدرتمند به نام DrRacket. طراحی آن ایجاد زبانهای جدید را تشویق میکند؛ بنابراین، پایگاه کاربری آن فراتر از موارد استفاده سنتی برنامهنویسی به آزمایش و توسعه زبان گسترش مییابد. راکت در جامعه گستردهتر زبانهای برنامهنویسی تأثیرگذار بوده و بر زبانهایی مانند جولیا تأثیر گذاشته و بر توسعه محیطهای برنامهنویسی آموزشی تأثیرگذار بوده است.
راکت از توابع کلاس اول پشتیبانی میکند و به توابع اجازه میدهد که به عنوان شهروندان کلاس اول در نظر گرفته شوند. این بدان معناست که میتوان آنها را به عنوان آرگومانها منتقل کرد، از توابع دیگر بازگرداند و به متغیرها اختصاص داد.
(define (apply-twice f x)
(f (f x)))
(apply-twice add1 5) ; برمیگرداند 7
سیستم ماکرو قدرتمند راکت اجازه میدهد تا گسترشهای نحوی ایجاد شود و به توسعهدهندگان این امکان را میدهد که فرمهای خاصی را ایجاد کنند که در زبان پایه وجود ندارند.
(define-syntax-rule (when condition body)
(if condition
(begin body)))
(when (> 3 2)
(display "3 بزرگتر از 2 است")) ; خروجی: 3 بزرگتر از 2 است
راکت از تطبیق الگو از طریق match
پشتیبانی میکند و این امکان را فراهم میآورد که کد تمیز و قابل خواندن باشد هنگام تجزیه دادهها.
(define (describe lst)
(match lst
[(list 0) "صفر"]
[(list n) (string-append "یک: " (number->string n))]
[_ "دیگر"]))
راکت به توابع اجازه میدهد که تعداد متغیر آرگومانها را با استفاده از نحو سهنقطه بپذیرند.
(define (sum . numbers)
(apply + numbers))
(sum 1 2 3 4) ; برمیگرداند 10
توابع در راکت میتوانند آرگومانهای اختیاری و کلیدی داشته باشند و این انعطافپذیری را در تعریف امضای توابع فراهم میکند.
(define (greet #:name [name "جهان"])
(string-append "سلام، " name "!"))
(greet) ; برمیگرداند "سلام، جهان!"
(greet #:name "آلیس") ; برمیگرداند "سلام، آلیس!"
راکت از برنامهنویسی شیگرا از طریق سیستم class
خود پشتیبانی میکند و امکان ایجاد کلاسها و متدها را فراهم میآورد.
(define my-class
(class object%
(super-new)
(define/public (greet) "سلام!")))
(define obj (new my-class))
(send obj greet) ; برمیگرداند "سلام!"
راکت ادامههای کلاس اول را فراهم میکند و به توسعهدهندگان این امکان را میدهد که جریان کنترل را به روشهای پیشرفته دستکاری کنند.
(define (call-with-current-continuation f)
(call/cc f))
(call-with-current-continuation
(lambda (k) (k 10))) ; برمیگرداند 10
راکت از پشتیبانی قرارداد داخلی برخوردار است و به توسعهدهندگان کمک میکند تا رفتار مورد انتظار توابع و ساختارها را مشخص کنند.
(define/contract (safe-div x y)
(-> number? (and/c number? (not/c (= y 0))) number?)
(/ x y))
راکت از یک سیستم ماژول برای تسهیل سازماندهی و قابلیت استفاده مجدد کد استفاده میکند.
(module my-module racket
(define (hello) "سلام از my-module!"))
راکت نوعدار یک نوع از راکت است که انواع ایستا را اضافه میکند و امکان بررسی نوع را در حین توسعه فراهم میآورد.
#lang typed/racket
(: add (-> Integer Integer Integer))
(define (add a b) (+ a b))
(add 2 3) ; برمیگرداند 5
DrRacket به عنوان IDE اصلی برای راکت عمل میکند و محیطی یکپارچه برای نوشتن و اجرای برنامههای راکت فراهم میآورد. این شامل ویژگیهایی مانند هایلایت نحوی، ابزارهای اشکالزدایی و یک REPL (حلقه خواندن-ارزیابی-چاپ) برای برنامهنویسی تعاملی است.
راکت دارای یک کامپایلر داخلی است که کد راکت را به بایتکد یا کد ماشین بومی برای اجرای کارآمد کامپایل میکند. سیستم زمان اجرای آن مدیریت حافظه، جمعآوری زباله و سایر وظایف سیستم سطح پایین را انجام میدهد.
ساخت پروژههای راکت معمولاً شامل سازماندهی کد به ماژولها و استفاده از سیستم بسته راکت برای مدیریت کتابخانههای خارجی است. پروژهها میتوانند با استفاده از raco
، ابزار خط فرمان راکت، برای کامپایل و اجرای فایلهای راکت ایجاد شوند.
raco make my-project.rkt
raco run my-project.rkt
راکت در حوزههای مختلفی استفاده میشود، از جمله:
راکت شباهتهایی با زبانهای برنامهنویسی مختلف دارد و بر ریشههای برنامهنویسی تابعی خود تأکید میکند:
ابزارهایی مانند racket2cpp
راکت وجود دارند که اجازه ترجمه منبع به منبع از راکت به C++ یا زبانهای مشابه را میدهند. علاوه بر این، برخی پروژههای تحقیقاتی بر روی ترجمه راکت به جاوااسکریپت یا پایتون تمرکز کردهاند که امکان ادغام آسانتر با برنامههای وب یا سیستمهای موجود را فراهم میکند.
ابزارهای موجود برای ترجمه منبع به منبع ممکن است شامل:
انعطافپذیری و قابلیتهای قوی متا برنامهنویسی راکت آن را به کاندیدای عالی برای ساخت زبانها و کاوش در پارادایمهای جدید برنامهنویسی تبدیل میکند. تاریخ غنی و توسعه مبتنی بر جامعه آن اطمینان میدهد که این زبان همچنان ابزاری ارزشمند برای معلمان، محققان و توسعهدهندگان نرمافزار خواهد بود.