لقد دخل تطوير لغة البرمجة النصية الثابتة الخاصة بي Umka إلى المرحلة عندما كان مطلوبًا اختبار قدرات اللغة باستخدام أمثلة أكثر تعقيدًا من البرامج النصية في بضع عشرات من الأسطر. لهذا ، قررت استخدام مترجم Lisp في لغتي . لقد ألهمتني تجربة تربوية قام بها روب بايك ، أحد مبتكري لغة Go. نشر بايك مؤخرًا مترجم Lisp الصغير في Go . لقد تأثرت بشكل خاص بملاحظة بايك بأن وصف المترجم الفوري كان في صفحة واحدة 13 من دليل Lisp 1.5 القديم .... بالنظر إلى التقارب النحوي لـ Umka و Go ، كان من الصعب مقاومة إغراء بناء مثل هذا المترجم الفوري في Umka ، ليس من خلال حمل رمز Pike حرفيًا ، ولكن تمامًا من الصفر. آمل أن يغفر لي خبراء اللثغة واللغات الوظيفية الدهشة الساذجة للتواصل مع الجمال.
بالنسبة للمبتدئين ، يمكن أن تصادف Lisp الصدمة. أين الخط الفاصل بين الكود والبيانات؟ أين الحلقات؟ أين هو المكدس؟ هيكل البيانات الوحيد هو شجرة. يمكن أن يمثل أيضًا قائمة. تصبح أيضًا شجرة بناء جملة مجردة عند تحليل البرنامج. كما أنه يحل محل المكدس عند تقييم التعبيرات. يمكن محاولة تنفيذ أي شجرة كرمز أو استخدامها كبيانات. بدلا من الحلقات - العودية. لا يوجد حتى الحساب في جوهر اللغة. ومع ذلك ، فهي لغة تورينج كاملة يمكن توسيعها بلا حدود ورشها بالسكر النحوي.
يتطلب تحديد مترجم Lisp أقل من صفحة. على امتداد ، بالطبع: يستخدم وظائف محددة في عدة صفحات سابقة. يبدو أن جون مكارثي مبتكر Lisp قد بذل قصارى جهده ليتفوق على نفسه في الإيجاز ، وفي النهاية نشر دليل Lisp الصغير الذي يحتوي على تعريف اللغة جنبًا إلى جنب مع مصدر المترجم - صفحتان في المجلة في المجموع. صحيح ، أضاف إلى العنوان: " ليست الحقيقة كاملة ".
جوهر اللغة (هنا نتحدث عن أقدم وأبسط اللهجات) يتطلب خمس وظائف أولية ، وأربع كلمات رئيسية وثابتين لا يمكن التعبير عنها عن طريق اللغة نفسها.
تراكيب اللغة الأساسية لأولئك الذين ليسوا على دراية بها
(car x)- إبراز رأس القائمةx(cdr x)- إبراز ذيل القائمةx(cons x y)- قوائم الانضمامxوy(atom x)- تحقق منxالذرية(eq x y)- فحص العناصر الذريةxوyمن أجل المساواة(cond (a x) (b y))- اختيار قيمةxإماyعن طريق شرطaأوb(quote x)- تعليمات للاستخدامxكما هي ، بدون حساب((lambda (x) a) y)- استدعاء دالة غير مسماة بالجسمaوالمعلمة الرسمية والمعلمةxالفعليةy((label ff (lambda (x) a)) y)- إعطاء اسم لوظيفة غير مسماةfft- حقيقةnil- تعبير خاطئ أو فارغ
باستخدام هذه التركيبات ، يمكن تعريف الوظائف العودية واستدعائها ، بحيث تتضمن عبارة واحدة برنامجًا كاملاً. إذا أضفنا وظائف حسابية إلى هذا ، فيمكننا ، على سبيل المثال ، حساب العامل 6:
((label fac (lambda (n) (cond ((eq n 0) 1) ((quote t) (mul n (fac (sub n 1))))))) 6)
Lisp, . Lisp 1.5 13 , . . , REPL . , , , label defn, , . Lisp .
نظرًا لأن المترجم الفوري مليء بالعودة ومعالجة الأشجار ، فقد كان بمثابة اختبار ممتاز للعديد من ميزات لغة أومكا ، من التكديس إلى جمع القمامة. أعتقد أن أومكا أبلى بلاءً حسنًا في الاختبار. كان علينا إصلاح اثنتين أو ثلاثة فقط من الأخطاء الطفيفة المتعلقة بتصدير الأسماء وإعلانات الأنواع المتقدمة. كان طول كود المترجم الكامل أقل من 400 سطر.
بالنسبة لأولئك الذين يرغبون في اللعب مع المترجم الفوري الخاص بي ونقل الإلهام من Rob Pike من خلال الترحيل ، أوصي بأخذ المجلد بأمثلة من الفرع الرئيسي ، وليس من الإصدار الأخير .