
مقدمة ودّية إلى Racket: اللغة الحديثة من عائلة Lisp
نُشر على مدونة geometridae.bearblog.dev دليل ودّي إلى Racket — اللغة التي تواصل تقليد Lisp منذ عام 1958 وتمكّن القارئ في نهايته من كتابة صياغته النحوية الخاصة بنفسه.
نُشر على مدونة geometridae.bearblog.dev مقدمة ودّية إلى Racket، الخليفة الحديثة لإحدى أقدم عائلات لغات البرمجة وأكثرها غرابة. وعد الكاتب بسيط: في نهاية الدليل سيكون القارئ قد كتب صياغته النحوية الخاصة.
من Lisp إلى Scheme ثم Racket
أنشأ جون مكارثي لغة Lisp عام 1958 في معهد MIT. وهي ثاني أقدم لغة عالية المستوى ما زالت مستخدمة؛ لا تسبقها سوى Fortran (1957) بسنة واحدة. ظهرت Python عام 1991 وJavaScript عام 1995.
في Lisp وُلدت أفكار نعدّها اليوم حديثة: جمع القمامة، والدوال كقيم من الرتبة الأولى، وحلقة REPL، والشرط الذي يعيد قيمة، والهوموييكونية — أي أن الشيفرة نفسها بنية بيانات في اللغة. وفي السبعينيات والثمانينيات كانت Lisp تعمل مباشرة على العتاد في «آلات Lisp» التي بنتها Symbolics وLMI. وبعد «شتاء الذكاء الاصطناعي» جفّ التمويل وفقدت اللغة مكانتها النجمية.
عام 1975 أنشأ جيرالد ساسمان وغاي ستيل لغة Scheme، وهي Lisp بسيطة شبه رياضية كُتب عليها الكتاب الكلاسيكي SICP. وفي عام 1995 أنشأ فريق ماتياس فيلايزن لغة PLT Scheme، التي أُعيد تسميتها Racket عام 2010. واليوم هي أكثر بكثير من Scheme: إنها لغة لبناء اللغات، وشعارها غير الرسمي هو البرمجة الموجّهة نحو اللغة.
من يستخدم Lisp اليوم
عدد أكبر مما يُتوقّع. تعمل Clojure في الإنتاج لدى بنوك وشركات طيران وشركات ناشئة؛ فمصرف Nubank، أكبر بنك رقمي في أمريكا اللاتينية، مبني عليها. وما زالت Common Lisp مع مُصرِّف SBCL حيّة في النظم الخبيرة وتخطيط الرحلات (ITA Software التي استحوذت عليها جوجل وأصبحت أساس Google Flights) والحوسبة العلمية.
ملايين الأشخاص يشغّلون Lisp كل يوم دون أن يلاحظوا: فمحرّرهم Emacs هو مُفسِّر Lisp. وGNU Guix توزيعة لينكس كاملة تُضبط بنسبة 100% بلغة Scheme. ولدى Racket مؤتمرها السنوي RacketCon، وتُستخدم في أبحاث اللغات والتحقق الشكلي (Rosette) والطباعة والنشر (Pollen). وتظهر لغات Lisp جديدة أيضًا: Fennel وJanet وHy.
كيف تبدو الشيفرة
التثبيت يستغرق خمس دقائق: مثبّت من racket-lang.org وبيئة DrRacket، حيث تُكتب التعريفات في الأعلى ويعمل REPL في الأسفل. أول سطر في الملف هو #lang racket، وهو يحدد اللغة، لأن Racket مصنع للغات.
قاعدة Lisp تُختصر في سطر واحد: كل شيء على شكل (المشغّل الوسيط1 الوسيط2…)، بلا استثناء. يعيد (+ 1 2) القيمة 3، ويعيد (* 3 (+ 2 2)) القيمة 12، ويعيد (string-append "hello " "world") السلسلة "hello world". لا توجد أولوية للمشغّلات ولا صياغة خاصة؛ فـ define ينشئ ثابتًا أو دالة، وlambda ينشئ دالة بلا اسم.
Lisp تعني معالجة القوائم: (first '(1 2 3)) يعيد 1، و(rest '(1 2 3)) يعيد (2 3)، و(cons 0 '(1 2 3)) يعيد (0 1 2 3). وبواسطة map وfilter وfoldl تُحلّ معظم مسائل القوائم دون كتابة حلقة for واحدة. والاستدعاء الذاتي هو الأسلوب الطبيعي: تُكتب المضروب بحيث تظهر الحالة الأساسية والخطوة نحوها، وبمكتبة 2htdp/image تكفي بضعة أسطر لرسم مثلث سيربينسكي.
الذروة هي الماكرو: علامة ' تحوّل الشيفرة إلى بيانات، وeval يعيد تشغيل البيانات كشيفرة. وباستخدام define-syntax-rule يضيف الدليل إلى اللغة حلقة while غير موجودة فيها. وصف آلان كاي Lisp بأنها «معادلات ماكسويل للبرمجيات»: نواة صغيرة يُشتق منها كل ما عداها. وللقراءة الإضافية يوصي الكاتب بـ How to Design Programs وThe Racket Guide وBeautiful Racket وSICP.
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.