" أعظم لغة برمجة تم إنشاؤها على الإطلاق "
- آلان كاي ، "على ليسب"

عندما طور مكارثي لغة ليسب في أواخر الخمسينيات ، كان الأمر مختلفًا اختلافًا جذريًا عن اللغات الحالية ، وأهمها
فورتران .
نفذت ليسب تسعة أفكار جديدة:
1.
الشرطية . العبارات الشرطية هي بنية if-then-else. الآن نحن نأخذ منهم أمرا مفروغا منه. لقد
اخترعهما مكارثي أثناء تطوير لشب. (لم يكن لدى فورتران في ذلك الوقت سوى بيانات goto التي كانت مرتبطة ارتباطًا وثيقًا بتعليمات الفروع على الأجهزة الأساسية). أدلى McCarthy ، أثناء وجوده في لجنة Algol ، ببيانات شرطية في Algol ، حيث انتقلت إلى لغات أخرى.
2.
أنواع الوظائف (نوع الوظيفة) . في Lisp ، الدالات هي كائنات من الدرجة الأولى - فهي نوع بيانات ، مثل الأرقام والسلاسل ، وما إلى ذلك ، ولها تمثيل حرفي ، ويمكن تخزينها في المتغيرات ، ويمكن تمريرها كوسائط ، إلخ.
3.
العودية . العودية ، بالطبع ، كانت موجودة كمفهوم رياضي قبل Lisp ، لكن Lisp كانت أول لغة برمجة تدعمها. (قد يكون هذا ضمنيًا في إنشاء وظائف ككائنات من الدرجة الأولى.)
4.
مفهوم جديد للمتغيرات . في Lisp ، جميع المتغيرات هي مؤشرات فعالة. القيم هي الأنواع ، وليس المتغيرات ، وتعيين أو ربط المتغيرات يعني نسخ المؤشرات ، وليس ما يشيرون إليه.
5.
جمع القمامة .
6.
البرامج تتكون من التعبيرات (البرامج تتكون من التعبيرات) . برامج Lisp عبارة عن أشجار تعبير ، تُرجع كل منها قيمة. (يمكن لبعض تعبيرات Lisp إرجاع قيم متعددة.) هذا يتناقض مع Fortran والعديد من اللغات الناجحة الأخرى التي تميز بين "التعبيرات" و "العبارات".
كان من الطبيعي أن يكون هناك مثل هذا الاختلاف في فورتران لأن اللغة كانت موجهة بشكل خطي (وليس من المستغرب بالنسبة للغة التي كانت فيها بطاقة المثقوب هي صيغة الإدخال). لا يمكن أن يكون لديك بيانات متداخلة. وعلى الرغم من أنك تحتاج إلى تعبيرات رياضية للعمل ، فليس هناك فائدة من إجبار شيء آخر على إرجاع قيمة ، لأنه ربما لم يكن هناك شيء ينتظر عودة.
تم رفع القيود مع ظهور اللغات ذات التكتلات الهيكلية ، ولكن بحلول ذلك الوقت كان الأوان قد فات. تم بالفعل التمييز بين التعبيرات والعبارات. مرت من فورتران إلى الغول ومزيد من ذريتهم.
عندما تتكون اللغة بالكامل من التعبيرات ، يمكنك جعل التعبيرات كما يحلو لك. يمكنك الكتابة إما (باستخدام بناء جملة
Arc )
(if foo (= x 1) (= x 2))
أو
(= x (if foo 1 2))
7.
نوع الرمز . تختلف الأحرف عن الأوتار ، وفي هذه الحالة يمكنك التحقق من المساواة من خلال مقارنة المؤشرات.
8.
تدوين للرمز باستخدام الأشجار من الشخصيات.
9.
اللغة كلها متاحة دائما . لا يوجد فرق واضح بين وقت القراءة ووقت الترجمة ووقت التشغيل. يمكنك ترجمة أو تشغيل التعليمات البرمجية أثناء القراءة ، أو قراءة أو تشغيل التعليمات البرمجية أثناء الترجمة ، أو قراءة أو ترجمة التعليمات البرمجية في وقت التشغيل.
تشغيل التعليمات البرمجية أثناء القراءة يتيح للمستخدمين إعادة برمجة بناء جملة Lisp؛ تشغيل التعليمات البرمجية في وقت الترجمة هو الأساس لوحدات الماكرو؛ تجميع وقت التشغيل هو الأساس لاستخدام Lisp كلغة امتداد في برامج مثل Emacs ؛ وأخيرًا ، تسمح قراءة وقت التشغيل للبرامج بالتفاعل باستخدام تعبيرات s ، وهي فكرة تم اختراعها مؤخرًا في XML.
استنتاج
عندما تم اختراع Lisp فقط ، كانت كل هذه الأفكار بعيدة جدًا عن ممارسات البرمجة المعتادة التي تمليها الأجهزة المتوفرة في أواخر الخمسينيات.
مع مرور الوقت ، تطورت اللغة الافتراضية ، المتجسدة في نجاح اللغات الشائعة ، تدريجياً نحو لغة ليسب. النقاط 1-5 أصبحت الآن واسعة الانتشار. النقطة 6 تبدأ في الظهور في التيار الرئيسي. في Python ، في بعض الأشكال ، هناك عنصر 7 ، على الرغم من عدم وجود بناء جملة مناسب. الفقرة 8 ، التي (مع الفقرة 9) تجعل وحدات الماكرو ممكنة في Lisp ، لا تزال في Lisp فقط ، ربما لأنه (أ) يتطلب هذه الأقواس أو شيء سيئ بنفس القدر ، و (ب) إذا إذا أضفت هذه الزيادة الأخيرة في القوة ، فلن تتمكن من الادعاء بأنك اخترعت لغة جديدة ، ولكنك طورت لهجة جديدة من Lisp ؛ -)
على الرغم من أنه مفيد للمبرمجين العصريين ، إلا أنه من الغريب وصف Lisp من حيث كيفية اختلافه عن الحيل العشوائية المستخدمة في لغات أخرى. ربما هذا ليس ما كان يفكر فيه مكارثي. لم يتم تصميم Lisp لإصلاح أخطاء Fortran ؛ بدا أكثر كمنتج ثانوي من محاولة
لبساط الحسابات .