لغة البرمجة ليسب
لغة ليسب (تاريخيًا LISP ، اختصارًا لـ "معالجة القوائم") هي عائلة من لغات البرمجة ذات تاريخ عريق، وتتميز بنظام كتابة بادئات كامل بين قوسين . [ 3 ] وُضعت مواصفاتها الأصلية في أواخر الخمسينيات، وهي ثاني أقدم لغة برمجة عالية المستوى لا تزال شائعة الاستخدام، بعد لغة فورتران . [ 4 ] [ 5 ] شهدت لغة ليسب تطورًا منذ بداياتها، وظهرت لها العديد من اللهجات على مر تاريخها. اليوم، تُعدّ لهجات ليسب العامة الأكثر شهرة هي: كومون ليسب ، وسكيم ، وراكيت ، وكلوجر . [ 6 ] [ 7 ] [ 8 ]
صُممت لغة ليسب في الأصل كطريقة عملية لكتابة البرامج الحاسوبية باستخدام الترميز الرياضي ، متأثرةً (وإن لم تكن مشتقة منها أصلاً) [ 9 ] بترميز حساب لامدا لألونزو تشيرش . وسرعان ما أصبحت لغة برمجة مفضلة في أبحاث الذكاء الاصطناعي . [ 10 ] وباعتبارها من أوائل لغات البرمجة، فقد ريادت ليسب العديد من الأفكار في علوم الحاسوب ، بما في ذلك هياكل البيانات الشجرية ، والإدارة التلقائية للتخزين ، والكتابة الديناميكية ، والشروط ، والدوال العليا ، والاستدعاء الذاتي ، والمترجم ذاتي الاستضافة ، [ 11 ] وحلقة القراءة والتقييم والطباعة . [ 12 ]
يُشتق اسم لغة ليسب من "معالج القوائم". [ 13 ] تُعد القوائم المتصلة إحدى هياكل البيانات الرئيسية في ليسب، ويتكون كود مصدر ليسب من قوائم. وبالتالي، تستطيع برامج ليسب معالجة كود المصدر كهيكل بيانات، مما أدى إلى ظهور أنظمة الماكرو التي تسمح للمبرمجين بإنشاء صيغ جديدة أو لغات خاصة بمجالات محددة مُضمنة في ليسب.
إنّ قابلية تبادل التعليمات البرمجية والبيانات هي ما يمنح لغة ليسب تركيبها النحوي المميز. تُكتب جميع التعليمات البرمجية للبرنامج على شكل تعابير s ، أو قوائم بين قوسين. يُكتب استدعاء الدالة أو الصيغة النحوية على شكل قائمة، حيث يُكتب اسم الدالة أو المعامل أولاً، ثم الوسائط؛ على سبيل المثال، fتُستدعى دالة تأخذ ثلاثة وسائط على النحو التالي : .(farg1arg2arg3)
تاريخ
بدأ جون مكارثي تطوير لغة ليسب عام 1958 أثناء دراسته في معهد ماساتشوستس للتكنولوجيا (MIT). كان دافعه إنشاء لغة برمجة للذكاء الاصطناعي تعمل على جهاز IBM 704 ، إذ كان يعتقد أن "شركة IBM خيارٌ واعدٌ لمتابعة أبحاث الذكاء الاصطناعي بجدية". [ 14 ] استلهم مكارثي من لغة معالجة المعلومات ( IPL)، التي كانت تعتمد أيضًا على معالجة القوائم، لكنه لم يستخدمها لأنها صُممت لأجهزة مختلفة، ووجد أن اللغة الجبرية أكثر جاذبية. [ 14 ] لهذه الأسباب، شارك في تصميم لغة معالجة القوائم فورتران ، التي طُبقت كمكتبة فورتران. مع ذلك، لم يكن راضيًا عنها لعدم دعمها للتكرار أو عبارة if-then-else الحديثة (التي كانت مفهومًا جديدًا عند ظهور ليسب لأول مرة). [ ملاحظة 1 ] [ 14 ]
استخدمت تدوينات مكارثي الأصلية " تعبيرات M " بين قوسين، والتي تُترجم إلى تعبيرات S. على سبيل المثال، تعبير M car[cons[A,B]]يُكافئ تعبير S. بمجرد تطبيق لغة ليسب، اختار المبرمجون بسرعة استخدام تعبيرات S، وتم التخلي عن تعبيرات M. [ 14 ] ظهرت تعبيرات M مرة أخرى مع محاولات قصيرة الأجل للغة MLisp [ 15 ] من قِبل هوراس إينيا ولغة CGOL من قِبل فوغان برات .(car(consAB))
تم تنفيذ لغة ليسب لأول مرة بواسطة ستيف راسل على جهاز كمبيوتر IBM 704 باستخدام البطاقات المثقبة . [ 16 ] كان راسل يعمل لدى مكارثي في ذلك الوقت وأدرك (لدهشة مكارثي) أنه يمكن تنفيذ دالة eval في لغة ليسب بلغة الآلة .
بحسب ماكارثي [ 17 ]
قال ستيف راسل: "انظر، لمَ لا أبرمج دالة التقييم هذه ؟" فأجبته: "ها ها، أنت تخلط بين النظرية والتطبيق، فهذه الدالة مخصصة للقراءة لا للحساب". لكنه مضى قدمًا وفعلها. أي أنه قام بتحويل دالة التقييم في بحثي إلى لغة الآلة IBM 704 ، وأصلح الأخطاء ، ثم روّج لها كمترجم للغة ليسب، وهو ما كانت عليه بالفعل. وهكذا، في تلك المرحلة، اتخذت لغة ليسب شكلها الحالي تقريبًا .
وكانت النتيجة مترجم لغة ليسب يعمل ويمكن استخدامه لتشغيل برامج ليسب، أو بشكل أدق، "تقييم تعبيرات ليسب".
أصبحت وحدتا ماكرو للغة التجميع في جهاز IBM 704 العمليات الأساسية لتفكيك القوائم: car ( محتويات جزء العنوان من رقم السجل) و cdr ( محتويات جزء الإنقاص من رقم السجل)، [ 18 ] حيث يشير "register" إلى سجلات وحدة المعالجة المركزية ( CPU ) في الحاسوب . ولا تزال لهجات لغة Lisp تستخدم carالرمزين cdr/ kɑːr / و / ˈkʊdər / للعمليات التي تُرجع العنصر الأول في القائمة وبقية عناصرها، على التوالي .
نشر مكارثي تصميم لغة ليسب في ورقة بحثية في مجلة اتصالات جمعية آلات الحوسبة (ACM) في 1 أبريل 1960، بعنوان "الدوال التكرارية للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول". [ 19 ] [ 20 ] وقد أظهر أنه باستخدام عدد قليل من المعاملات البسيطة ورمز للدوال المجهولة مستعار من تشرش، يمكن بناء لغة كاملة تورينج للخوارزميات.
تم تطوير أول مُترجم كامل للغة ليسب، مكتوب بلغة ليسب نفسها، عام 1962 على يد تيم هارت ومايك ليفين في معهد ماساتشوستس للتكنولوجيا. وكان بالإمكان ترجمته ببساطة عن طريق تفسير مُفسِّر ليسب موجود لرمز المُترجم، مما ينتج عنه مُخرجات بلغة الآلة قابلة للتنفيذ بسرعة تفوق سرعة المُفسِّر بأربعين ضعفًا. [ 21 ] وقد أدخل هذا المُترجم نموذج ليسب للترجمة التزايدية ، حيث يمكن للدوال المُترجمة والمُفسَّرة أن تتداخل بحرية. وتُعد اللغة المستخدمة في مذكرة هارت وليفين أقرب بكثير إلى أسلوب ليسب الحديث من كود مكارثي السابق.
تم تطوير إجراءات جمع القمامة بواسطة طالب الدراسات العليا في معهد ماساتشوستس للتكنولوجيا دانيال إدواردز، قبل عام 1962. [ 22 ]
خلال ثمانينيات وتسعينيات القرن العشرين، بُذلت جهودٌ حثيثة لتوحيد العمل على لهجات لغة ليسب الجديدة (معظمها لغاتٌ خلفت لغة ماك ليسب، مثل زيتا ليسب ونيل (التنفيذ الجديد للغة ليسب)) في لغةٍ واحدة. وكانت اللغة الجديدة، كومون ليسب ، متوافقةً إلى حدٍ ما مع اللهجات التي حلت محلها (يشير كتاب "كومون ليسب: اللغة" إلى توافق مختلف بنياتها). وفي عام ١٩٩٤، نشرت المنظمة الوطنية الأمريكية للمعايير (ANSI) معيار كومون ليسب، بعنوان "ANSI X3.226-1994 لغة برمجة تكنولوجيا المعلومات كومون ليسب".
الجدول الزمني
| 1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1، 1.5، LISP 2 (مهجورة) | |||||||||||||||
| ماكليس | |||||||||||||||
| تداخل | |||||||||||||||
| MDL | |||||||||||||||
| آلة التأتأة | |||||||||||||||
| مخطط | R5RS | R6RS | R7RS صغير | ||||||||||||
| لا شيء | |||||||||||||||
| ZIL (لغة تنفيذ Zork) | |||||||||||||||
| فرانز ليسب | |||||||||||||||
| muLisp | |||||||||||||||
| لغة الشفرة الشائعة | معيار ANSI | ||||||||||||||
| لي لِسْب | |||||||||||||||
| مخطط معهد ماساتشوستس للتكنولوجيا | |||||||||||||||
| XLISP | |||||||||||||||
| تي | |||||||||||||||
| شيز سكيم | |||||||||||||||
| إيماكس ليسب | |||||||||||||||
| أوتو ليسب | |||||||||||||||
| PicoLi sp | |||||||||||||||
| غامبيت | |||||||||||||||
| EuLisp | |||||||||||||||
| لغة ISLISP | |||||||||||||||
| أوبن ليسب | |||||||||||||||
| مخطط PLT | مضرب | ||||||||||||||
| لغة نيو ليسب | |||||||||||||||
| جنو غايل | |||||||||||||||
| لغة ليسب المرئية | |||||||||||||||
| كلوجر | |||||||||||||||
| قوس | |||||||||||||||
| LFE | |||||||||||||||
| هي | |||||||||||||||
الصلة بالذكاء الاصطناعي
منذ نشأتها، ارتبطت لغة ليسب ارتباطًا وثيقًا بمجتمع أبحاث الذكاء الاصطناعي ، لا سيما على أنظمة PDP-10 [ 23 ] . استُخدمت ليسب كتطبيق للغة مايكرو بلانر ، التي استُخدمت بدورها في نظام الذكاء الاصطناعي الشهير SHRDLU . في سبعينيات القرن الماضي، ومع ازدياد فروع أبحاث الذكاء الاصطناعي التجارية، أصبح أداء أنظمة ليسب الحالية مشكلة متنامية، إذ بات لزامًا على المبرمجين الإلمام بتداعيات الأداء المترتبة على مختلف التقنيات والخيارات المستخدمة في تطبيق ليسب. [ 24 ]
علم الأنساب والمتغيرات
على مدار تاريخها الممتد لستين عامًا، أنتجت لغة ليسب العديد من الصيغ المختلفة للغة التعبيرية S. وقد تم توحيد بعض هذه الصيغ وتطبيقها من قبل مجموعات مختلفة ذات أولويات متباينة (على سبيل المثال، لكل من Common Lisp و Scheme تطبيقات متعددة). مع ذلك، في حالات أخرى، يُعرّف مشروع برمجي لغة ليسب دون معيار موحد، ولا يوجد تمييز واضح بين اللهجة والتطبيق (على سبيل المثال، تندرج Clojure و Emacs Lisp ضمن هذه الفئة).
قد تكون الاختلافات بين اللهجات (أو التطبيقات) واضحةً تمامًا؛ فعلى سبيل المثال، تستخدم لغة Common Lisp الكلمة المفتاحية ` defunname` لتسمية الدوال، بينما تستخدم لغة Scheme الكلمة المفتاحية `name` define. [ ملاحظة 2 ] ضمن اللهجة الموحدة، تدعم التطبيقات المتوافقة نفس اللغة الأساسية، ولكن مع إضافات ومكتبات مختلفة. وهذا يُحدث أحيانًا تغييرات واضحة عن اللغة الأساسية؛ فعلى سبيل المثال، تستخدم لغة Guile (وهي تطبيق للغة Scheme) الكلمة المفتاحية ` define*name` لإنشاء الدوال التي يمكن أن تحتوي على وسائط افتراضية أو وسائط مفتاحية ، وكلاهما غير موحد.
اللهجات ذات الأهمية التاريخية


- LISP 1 [ 25 ] – التنفيذ الأول.
- LISP 1.5 [ 26 ] – أول إصدار تم توزيعه على نطاق واسع، تم تطويره بواسطة مكارثي وآخرين في معهد ماساتشوستس للتكنولوجيا. وقد سُمي بهذا الاسم لأنه احتوى على العديد من التحسينات على مترجم "LISP 1" الأصلي، ولكنه لم يكن إعادة هيكلة رئيسية كما كان مخططًا له في LISP 2 .
- ستانفورد ليسب 1.6 [ 27 ] – لغة برمجة خلفت ليسب 1.5، طُوّرت في مختبر الذكاء الاصطناعي بجامعة ستانفورد ، ووُزّعت على نطاق واسع لأنظمة PDP-10 التي تعمل بنظام التشغيل TOPS-10 . وقد أصبحت قديمة الطراز مع ظهور ماك ليسب وإنتر ليسب.
- ماكليسب [ 28 ] – طُوِّرت ماكليسب لمشروع ماك التابع لمعهد ماساتشوستس للتكنولوجيا، وهي امتداد مباشر للغة ليسب 1.5. كانت تعمل على أنظمة PDP-10 و Multics . لاحقًا، عُرفت ماكليسب باسم ماكليسب، ويُشار إليها غالبًا بهذا الاسم. لا علاقة لكلمة "ماك" في ماكليسب بنظام ماكنتوش من شركة أبل أو شركة مكارثي .
- Interlisp [ 29 ] – طُوِّرت في شركة BBN Technologies لأنظمة PDP-10 التي تعمل بنظام التشغيل TENEX ، ثم اعتُمدت لاحقًا كلغة Lisp "الساحل الغربي" لأجهزة Xerox Lisp تحت اسم InterLisp-D. ونُشرت نسخة مصغرة منها باسم "InterLISP 65" لأجهزة Atari ذات 8 بت التي تعمل بمعالج MOS Technology 6502. وكانت لغتا Maclisp وInterLisp منافستين قويتين.
- فرانز ليسب – في الأصل مشروع لجامعة كاليفورنيا، بيركلي ؛ تم تطويره لاحقًا بواسطة شركة فرانز. الاسم هو تشويه فكاهي لاسم " فرانز ليست "، ولا يشير إلى أليجرو كومون ليسب ، وهي لهجة من لغة كومون ليسب التي باعتها شركة فرانز في السنوات الأخيرة.
- لغة muLISP – طُوِّرت في البداية بواسطة ألبرت د. ريتش وديفيد ستاوتمير لأنظمة الحواسيب الصغيرة. أُتيحت تجاريًا عام 1979، وكانت تعمل على أنظمة CP/M بذاكرة وصول عشوائي (RAM) لا تتجاوز 64 كيلوبايت، ثم نُقلت لاحقًا إلى نظام MS-DOS. توقف تطوير نسخة MS-DOS عام 1995. كُتب برنامج "Derive" الرياضي بلغة muLISP لنظام MS-DOS، ثم لنظام Windows حتى عام 2007.
- لغة XLISP ، التي استندت إليها لغة AutoLISP .
- تم استخدام Standard Lisp و Portable Standard Lisp على نطاق واسع ونقلها، خاصة مع نظام الجبر الحاسوبي REDUCE.
- لغة زيتا ليسب ، والتي تُسمى أيضاً لغة ليسب للآلات، تُستخدم على آلات ليسب ، وهي سليل مباشر للغة ماك ليسب. كان لزيتا ليسب تأثير كبير على لغة كومون ليسب.
- LeLisp هي لهجة فرنسية من لغة Lisp. وقد كُتب أحد أوائل برامج بناء الواجهات (المسمى واجهة SOS [ 30 ] ) بلغة LeLisp.
- مخطط (1975). [ 31 ]
- لغة Common Lisp (1984)، كما ورد في كتاب Common Lisp the Language ، هي عبارة عن دمج لعدة محاولات متباينة (ZetaLisp، و Spice Lisp ، و NIL ، و S-1 Lisp ) لإنشاء لهجات لاحقة [ 32 ] للغة Maclisp، مع تأثيرات جوهرية من لهجة Scheme أيضًا. كانت هذه النسخة من Common Lisp متاحة لمجموعة واسعة من المنصات، وقد اعتُمدت من قِبل الكثيرين كمعيار فعلي [ 33 ] حتى صدور معيار ANSI Common Lisp (ANSI X3.226-1994). من بين اللهجات الفرعية الأكثر انتشارًا للغة Common Lisp: Steel Bank Common Lisp (SBCL)، وCMU Common Lisp (CMU-CL)، وClozure OpenMCL (لا تخلط بينها وبين Clojure!)، وGNU CLisp، والإصدارات اللاحقة من Franz Lisp؛ جميعها تلتزم بمعيار ANSI CL اللاحق (انظر أدناه).
- كان برنامج Dylan في نسخته الأولى مزيجًا من لغة Scheme مع نظام كائنات Common Lisp.
- EuLisp – محاولة لتطوير لغة Lisp جديدة فعالة ومنقحة.
- ISLISP – محاولة لتطوير لغة Lisp جديدة فعالة ومنقحة. تم توحيدها كمعيار ISO/IEC 13816:1997 [ 34 ] وتم تنقيحها لاحقًا كمعيار ISO/IEC 13816:2007: [ 35 ] تكنولوجيا المعلومات – لغات البرمجة، وبيئاتها، وواجهات برامج النظام – لغة البرمجة ISLISP .
- مخطط IEEE - معيار IEEE، 1178-1990 (R1995).
- معيار ANSI Common Lisp هو معيار صادر عن المعهد الوطني الأمريكي للمعايير (ANSI) للغة Common Lisp، أنشأته اللجنة الفرعية X3J13 ، التي تأسست [ 36 ] انطلاقًا من كتاب Common Lisp: The Language كوثيقة أساسية، والعمل من خلال عملية توافق آراء عامة لإيجاد حلول للمشاكل المشتركة المتعلقة بقابلية نقل البرامج وتوافق تطبيقات Common Lisp. وعلى الرغم من كونه معيارًا رسميًا من معايير ANSI، إلا أن تطبيق معيار ANSI Common Lisp وبيعه واستخدامه وتأثيره كان ولا يزال منتشرًا في جميع أنحاء العالم.
- ACL2 أو "منطق حسابي للغة Common Lisp التطبيقية"، هي نسخة تطبيقية (خالية من الآثار الجانبية) من لغة Common LISP. تُعد ACL2 لغة برمجة قادرة على نمذجة أنظمة الحاسوب، وأداة للمساعدة في إثبات خصائص تلك النماذج.
- Clojure ، وهي لهجة حديثة من لغة Lisp يتم تجميعها إلى آلة Java الافتراضية وتركز بشكل خاص على التزامن .
- لغة برمجة ألعاب الفيديو الموجهة نحو التجميع (GOAL) هي لغة برمجة طورها آندي جافين في شركة نوتي دوغ . كُتبت باستخدام لغة أليجرو كومون ليسب، واستُخدمت في تطوير سلسلة ألعاب جاك ودكستر بأكملها التي طورتها شركة نوتي دوغ.
من عام 2000 حتى الآن
بعد أن شهدت لغة Lisp تراجعًا إلى حد ما في التسعينيات، فقد شهدت عودة الاهتمام بها بعد عام 2000. وقد تركزت معظم الأنشطة الجديدة حول تطبيقات Common Lisp و Scheme و Emacs Lisp و Clojure و Racket ، وتشمل تطوير مكتبات وتطبيقات محمولة جديدة.
استلهم العديد من مبرمجي لغة ليسب الجدد من كتابات بول غراهام وإريك إس. ريموند، فتوجهوا إلى تعلم لغة اعتبرها آخرون قديمة. وكثيراً ما يصف مبرمجو ليسب الجدد هذه اللغة بأنها تجربة مُلهمة، ويدّعون أنهم أكثر إنتاجية بكثير من اللغات الأخرى. [ 37 ] ويمكن مقارنة هذا الوعي المتزايد بفترة ركود الذكاء الاصطناعي ، وما شهدته ليسب من ازدهار وجيز في منتصف التسعينيات. [ 38 ]
اعتبارًا من عام 2010كان هناك أحد عشر تطبيقًا نشطًا للغة Common Lisp. [ 39 ]
أنشأ مجتمع المصادر المفتوحة بنية تحتية داعمة جديدة: CLiki عبارة عن ويكي يجمع معلومات متعلقة بلغة Common Lisp، ودليل Common Lisp يسرد الموارد، وقناة #lisp هي قناة IRC شائعة تسمح بمشاركة مقاطع الشفرة والتعليق عليها (بدعم من lisppaste، وهو روبوت IRC مكتوب بلغة Lisp)، وPlanet Lisp [ 40 ] يجمع محتويات مدونات متنوعة متعلقة بلغة Lisp، وفي LispForum [ 41 ] يناقش المستخدمون مواضيع Lisp، وLispjobs [ 42 ] هي خدمة للإعلان عن فرص العمل، وهناك خدمة إخبارية أسبوعية، Weekly Lisp News . Common-lisp.net هو موقع استضافة لمشاريع Common Lisp مفتوحة المصدر. Quicklisp [ 43 ] هو مدير مكتبات للغة Common Lisp.
احتُفل بمرور خمسين عامًا على لغة ليسب (1958-2008) في مؤتمر LISP50@OOPSLA. [ 44 ] تُعقد اجتماعات دورية للمستخدمين المحليين في بوسطن وفانكوفر وهامبورغ. وتشمل الفعاليات الأخرى الاجتماع الأوروبي للغة ليسب المشتركة، وندوة ليسب الأوروبية، ومؤتمر ليسب الدولي.
يُحافظ مجتمع لغة Scheme بنشاط على أكثر من عشرين تطبيقًا . وقد طُوّرت العديد من التطبيقات الجديدة الهامة (Chicken، Gambit، Gauche، Ikarus، Larceny، Ypsilon) خلال العقد الأول من الألفية الثانية. حظي معيار Scheme، وهو التقرير الخامس المنقح حول لغة Scheme الخوارزمية [ 45 ]، بقبول واسع في مجتمع Scheme. وقد أسفرت عملية طلبات تطبيق Scheme عن إنشاء العديد من المكتبات والامتدادات شبه القياسية للغة. وتستمر مجتمعات مستخدمي تطبيقات Scheme الفردية في النمو. بدأت عملية جديدة لتوحيد اللغة في عام 2003، وأدت إلى معيار R6RS Scheme في عام 2007. ويبدو أن استخدام Scheme أكاديميًا في تدريس علوم الحاسوب قد تراجع نوعًا ما. فبعض الجامعات لم تعد تستخدم Scheme في مقرراتها التمهيدية في علوم الحاسوب؛ [ 46 ] [ 47 ] ويستخدم معهد ماساتشوستس للتكنولوجيا (MIT) الآن لغة Python بدلًا من Scheme في برنامج علوم الحاسوب الجامعي ودورة MITx المفتوحة عبر الإنترنت. [ 48 ] [ 49 ]
توجد عدة لهجات جديدة للغة ليسب: Arc و Hy و Nu وLiskell و LFE (إرلانج بنكهة ليسب). أما محلل لغة جوليا فهو مكتوب بلغة فيمتوليسب، وهي لهجة من لغة سكيم (جوليا مستوحاة من سكيم، التي بدورها لهجة من ليسب).
في أكتوبر 2019، أصدر بول غراهام مواصفات لـ Bel ، "لهجة جديدة من لغة Lisp".
اللهجات الرئيسية
تمثل لغتا Common Lisp و Scheme اتجاهين رئيسيين في تطوير لغة Lisp. وتجسد هاتان اللغتان خيارات تصميم مختلفة بشكل كبير.
لغة Common Lisp هي امتداد للغة Maclisp . وقد تأثرت بشكل أساسي بلغات Lisp Machine Lisp وMaclisp و NIL و S-1 Lisp و Spice Lisp وScheme. [ 50 ] تتشابه Common Lisp مع لغة Lisp Machine Lisp (وهي لهجة واسعة من لغة Lisp تُستخدم لبرمجة آلات Lisp )، ولكنها صُممت لتكون قابلة للتنفيذ بكفاءة على أي حاسوب شخصي أو محطة عمل. Common Lisp هي لغة برمجة عامة الأغراض، وبالتالي فهي تتمتع بمعيار لغوي واسع يشمل العديد من أنواع البيانات المدمجة، والدوال، ووحدات الماكرو، وعناصر لغوية أخرى، بالإضافة إلى نظام كائنات ( نظام كائنات Common Lisp ). كما استعارت Common Lisp بعض الميزات من لغة Scheme، مثل النطاق المعجمي والإغلاقات المعجمية . تتوفر تطبيقات لغة Common Lisp لاستهداف منصات مختلفة مثل LLVM ، [ 51 ] وآلة جافا الافتراضية ، [ 52 ] وx86-64، وPowerPC، وAlpha، وARM، وMotorola 68000، وMIPS، [ 53 ] وأنظمة تشغيل مثل Windows وmacOS وLinux وSolaris وFreeBSD وNetBSD وOpenBSD وDragonfly BSD وHeroku. [ 54 ]
لغة Scheme هي لهجة من لغة البرمجة Lisp، ذات نطاق ثابت وتكرار ذيلي صحيح، ابتكرها جاي إل. ستيل الابن وجيرالد جاي سوسمان . صُممت Scheme لتتمتع بدلالات واضحة وبسيطة للغاية، وبطرق قليلة لتكوين التعبيرات. صُممت Scheme قبل Common Lisp بعقد تقريبًا، وتتميز بتصميم أكثر بساطة. تحتوي على مجموعة أصغر بكثير من الميزات القياسية، ولكنها تتضمن بعض ميزات التنفيذ (مثل تحسين الاستدعاء الذيلي والاستمراريات الكاملة ) غير المحددة في Common Lisp. تجد مجموعة واسعة من نماذج البرمجة، بما في ذلك الأنماط الإجرائية والوظيفية وأنماط تمرير الرسائل، تعبيرًا مناسبًا في Scheme. تستمر Scheme في التطور من خلال سلسلة من المعايير (التقرير المنقح حول لغة Scheme الخوارزمية) وسلسلة من طلبات تنفيذ Scheme .
كلوجر هي لهجة من لغة ليسب تستهدف بشكل أساسي آلة جافا الافتراضية ، وبيئة التشغيل المشتركة (CLR)، وآلة بايثون الافتراضية ، وآلة روبي الافتراضية YARV ، والترجمة إلى جافا سكريبت . صُممت كلوجر لتكون لغة عملية متعددة الأغراض. تستمد كلوجر تأثيرات كبيرة من هاسكل ، وتركز بشدة على مبدأ عدم قابلية التغيير. [ 55 ] توفر كلوجر إمكانية الوصول إلى أطر عمل ومكتبات جافا، مع تلميحات اختيارية للأنواع واستنتاجها ، مما يسمح بتجنب استخدام الانعكاس عند استدعاء جافا، ويتيح إجراء عمليات أولية سريعة. لم تُصمم كلوجر لتكون متوافقة مع الإصدارات السابقة من لهجات ليسب الأخرى. [ 56 ]
علاوة على ذلك، تُستخدم لهجات لغة ليسب كلغات برمجة نصية في العديد من التطبيقات، وأشهرها إيماكس ليسب في محرر إيماكس ، وأوتو ليسب ولاحقًا فيجوال ليسب في أوتوكاد ، ونايكويست في أوداسيتي ، وسكيم في ليلي بوند . ويُعزى شيوع استخدام مُفسِّر سكيم المُفيد نظرًا لصغر حجمه المُحتمل، مما يجعله مناسبًا بشكل خاص للبرمجة النصية المُضمَّنة. ومن الأمثلة على ذلك SIOD و TinyScheme ، اللذان تم تضمينهما بنجاح في مُعالج الصور جيمب تحت الاسم العام "Script-fu". [ 57 ] كما تم تضمين LIBREP، وهو مُفسِّر ليسب من تطوير جون هاربر، والمبني في الأصل على لغة إيماكس ليسب ، في مدير النوافذ Sawfish . [ 58 ]
اللهجات الموحدة
تم توحيد اللهجات الرسمية للغة Lisp: R6RS Scheme و R7RS Scheme و IEEE Scheme و [ 59 ] ANSI Common Lisp و ISO ISLISP .
ابتكارات لغوية
يحدد بول غراهام تسعة جوانب مهمة في لغة ليسب تميزها عن اللغات الموجودة مثل فورتران : [ 60 ]
- لا تقتصر الشروط على الانتقال إلى
- وظائف من الدرجة الأولى
- التكرار
- التعامل مع المتغيرات بشكل موحد كمؤشرات ، وترك الأنواع للقيم
- جمع القمامة
- برامج مصنوعة بالكامل من تعابير بدون عبارات
- نوع بيانات الرمز، وهو يختلف عن نوع بيانات السلسلة النصية
- تدوين للرموز البرمجية المكونة من أشجار من الرموز (باستخدام العديد من الأقواس )
- تتوفر اللغة الكاملة عند وقت التحميل ، ووقت الترجمة ، ووقت التشغيل
كانت لغة ليسب أول لغة تُمثَّل فيها بنية كود البرنامج بدقة ومباشرة في بنية بيانات قياسية، وهي ميزة أُطلق عليها لاحقًا اسم " التماثل ". وبالتالي، يمكن التلاعب بدوال ليسب أو تعديلها أو حتى إنشاؤها داخل برنامج ليسب دون الحاجة إلى تعديلات على مستوى أدنى. يُعتبر هذا عمومًا إحدى المزايا الرئيسية للغة فيما يتعلق بقدرتها التعبيرية، ويجعلها مناسبة لوحدات الماكرو النحوية والتقييم الدائري الفائق .
ابتكر مكارثي صيغة شرطية باستخدام if-then-else لبرنامج شطرنج مكتوب بلغة فورتران . اقترح إدراجها في لغة ألغول ، لكنها لم تُضمّن في مواصفات ألغول 58. أما في لغة ليسب، فقد استخدم مكارثي بنية cond الأكثر عمومية . [ 61 ] تبنّت ألغول 60 صيغة if-then-else وساهمت في انتشارها.
أثرت لغة ليسب بشكل كبير على آلان كاي ، قائد فريق البحث الذي طور لغة سمول توك في مركز أبحاث زيروكس بارك ؛ وبدورها تأثرت ليسب بسمول توك، حيث تبنت لهجاتها اللاحقة ميزات البرمجة كائنية التوجه (مثل فئات الوراثة، وتغليف الكائنات، وتمرير الرسائل، إلخ) في سبعينيات القرن الماضي. قدم نظام كائنات Flavors مفهوم الوراثة المتعددة ومفهوم mixin . يوفر نظام كائنات Common Lisp الوراثة المتعددة، والأساليب المتعددة مع الإرسال المتعدد ، والوظائف العامة من الدرجة الأولى ، مما ينتج عنه شكل مرن وقوي من الإرسال الديناميكي . وقد شكل هذا النظام نموذجًا للعديد من أنظمة كائنات ليسب اللاحقة (بما في ذلك Scheme )، والتي غالبًا ما تُنفذ عبر بروتوكول الكائن الفائق ، وهو تصميم دائري انعكاسي يُعرَّف فيه نظام الكائنات بدلالة نفسه: كانت ليسب ثاني لغة بعد سمول توك (ولا تزال واحدة من اللغات القليلة جدًا) التي تمتلك مثل هذا النظام. بعد سنوات عديدة، اقترح آلان كاي أنه نتيجة لتضافر هذه الميزات، فإن لغتي سمول توك وليسب فقط يمكن اعتبارهما نظامي برمجة كائنية التوجه مصممين بشكل صحيح. [ 62 ]
أدخلت لغة ليسب مفهوم جمع البيانات المهملة التلقائي ، حيث يقوم النظام بفحص الذاكرة المخصصة (الكومة) بحثًا عن الذاكرة غير المستخدمة. وقد حفز استخدام ليسب هذا المفهوم التقدم في خوارزميات جمع البيانات المهملة الحديثة والمتطورة، مثل جمع البيانات المهملة التوليدي. [ 63 ]
قال إدسكار دبليو ديكسترا في محاضرته بمناسبة حصوله على جائزة تورينج عام 1972:
بفضل بعض المبادئ الأساسية، أظهرت لغة ليسب استقرارًا ملحوظًا. علاوة على ذلك، كانت ليسب بمثابة منصة لعدد كبير من تطبيقات الحاسوب الأكثر تطورًا. وقد وُصفت ليسب مازحةً بأنها "أذكى طريقة لإساءة استخدام الحاسوب". أرى أن هذا الوصف إطراءٌ كبير، لأنه ينقل جوهر التحرر: فقد ساعدت عددًا من ألمع العقول البشرية على التفكير بأفكار كانت تبدو مستحيلة في السابق. [ 64 ]
بسبب متطلباتها الكبيرة من الموارد فيما يتعلق بأجهزة الحوسبة المبكرة (بما في ذلك المعالجات الدقيقة المبكرة)، لم تحظَ لغة ليسب بشعبية واسعة خارج مجتمع الذكاء الاصطناعي، على عكس لغة فورتران ولغة سي المنحدرة من لغة ألغول . ونظرًا لملاءمتها للتطبيقات المعقدة والديناميكية، شهدت ليسب انتعاشًا في الاهتمام الشعبي خلال العقد الثاني من الألفية الثانية. [ 65 ]
بناء الجملة والدلالات
- أمثلة هذه المقالة مكتوبة بلغة Common Lisp (على الرغم من أن معظمها صالح أيضًا في لغة Scheme ).
التعبيرات الرمزية (التعبيرات الرمزية)
لغة ليسب هي لغة تعبيرية . على عكس معظم اللغات الأخرى، لا يوجد تمييز بين "التعبيرات" و "العبارات" ؛ فجميع التعليمات البرمجية والبيانات تُكتب كتعبيرات. عند تقييم تعبير ما ، ينتج عنه قيمة (أو قيم متعددة)، والتي يمكن تضمينها في تعبيرات أخرى. يمكن أن تكون كل قيمة من أي نوع بيانات.
قدّمت ورقة مكارثي البحثية عام 1958 نوعين من بناء الجملة: التعبيرات الرمزية ( S-expressions ، sexps)، التي تعكس التمثيل الداخلي للشيفرة والبيانات؛ والتعبيرات الوصفية ( M-expressions )، التي تعبر عن وظائف التعبيرات الرمزية. لم تلقَ التعبيرات الوصفية رواجًا، وتستخدم جميع لغات ليسب تقريبًا اليوم التعبيرات الرمزية لمعالجة كل من الشيفرة والبيانات.
يُعدّ استخدام الأقواس أبرز ما يُميّز لغة ليسب عن لغات البرمجة الأخرى. ونتيجةً لذلك، أطلق الطلاب عليها منذ زمنٍ طويل ألقابًا مثل " ضائعة في أقواس غبية" أو "الكثير من الأقواس الزائدة المزعجة" . [ 66 ] مع ذلك، يُعزى جزء كبير من قوة ليسب إلى صيغة التعبيرات S: فهي بسيطة ومتسقة، مما يُسهّل معالجتها بواسطة الحاسوب. لكن صيغة ليسب لا تقتصر على تدوين الأقواس التقليدي، بل يُمكن توسيعها لتشمل تدوينات بديلة. على سبيل المثال، XMLisp هي امتداد للغة Common Lisp يستخدم بروتوكول الكائنات الوصفية لدمج التعبيرات S مع لغة الترميز القابلة للتوسيع ( XML ).
يمنح الاعتماد على التعابير لغة ليسب مرونةً كبيرة. ولأن دوال ليسب تُكتب على شكل قوائم، يُمكن معالجتها تمامًا كالبيانات. وهذا يُسهّل كتابة برامج تُعالج برامج أخرى ( البرمجة الوصفية ). تستغل العديد من لهجات ليسب هذه الميزة باستخدام أنظمة الماكرو، مما يُتيح توسيع اللغة بلا حدود تقريبًا.
القوائم
تُكتب قائمة Lisp بحيث تُفصل عناصرها بمسافات بيضاء ، وتُحاط بأقواس. على سبيل المثال، هي قائمة عناصرها هي الذرات الثلاث و و . هذه القيم مُحددة النوع ضمنيًا: فهي على التوالي عددان صحيحان ونوع بيانات خاص بلغة Lisp يُسمى "رمزًا"، ولا يلزم تعريفها على هذا النحو.(12foo)12foo
تُمثَّل القائمة الفارغة ()أيضًا بالذرة الخاصة nil. وهي الكيان الوحيد في لغة ليسب الذي يُمثِّل ذرة وقائمة في آنٍ واحد.
تُكتب التعابير على شكل قوائم، باستخدام تدوين البادئة . العنصر الأول في القائمة هو اسم دالة، أو اسم ماكرو، أو تعبير لامدا، أو اسم "عامل خاص" (انظر أدناه). أما باقي القائمة فهي الوسائط. على سبيل المثال، listتُرجع الدالة وسائطها كقائمة، لذا فإن التعبير
( القائمة 1 2 ( اقتباس foo ))يُقيّم إلى القائمة . علامة الاقتباس قبل في المثال السابق هي "عامل خاص" يُعيد وسيطه دون تقييمه. تُقيّم أي تعبيرات غير مُقتبسة بشكل متكرر قبل تقييم التعبير المُحيط بها. على سبيل المثال،(12foo)foo
( القائمة 1 2 ( القائمة 3 4 ))تُقيّم الدالة إلى قائمة . الوسيط الثالث هو قائمة؛ ويمكن أن تكون القوائم متداخلة.(12(34))
المشغلون
تُعامل عوامل التشغيل الحسابية بشكل مماثل. التعبير
( + 1 2 3 4 )يُقيّم إلى 10. المكافئ في التدوين الوسطي سيكون " ".1+2+3+4
لا يوجد في لغة ليسب مفهومٌ للمعاملات كما هو مُطبَّق في اللغات المُشتقة من لغة ALGOL . المعاملات الحسابية في ليسب هي دوالٌ متغيرة الوسائط (أو دوالٌ من الرتبة n )، قادرة على أخذ أي عدد من الوسائط. يُطبَّق أحيانًا معامل الزيادة '++' على نمط لغة C تحت اسم incfيُعطي الصيغة.
( زيادة x )مكافئ لـ (setq x (+ x 1))، إرجاع القيمة الجديدة لـ x.
تُوفّر "المعاملات الخاصة" (التي تُسمى أحيانًا "الصيغ الخاصة") بنية التحكم في لغة ليسب. على سبيل المثال، ifيأخذ المعامل الخاص ثلاثة وسائط. إذا كان الوسيط الأول غير فارغ، فإنه يُقيّم إلى الوسيط الثاني؛ وإلا، فإنه يُقيّم إلى الوسيط الثالث. وبالتالي، فإن التعبير
( إذا كانت القائمة 1 2 "foo" فارغة ) ( القائمة 3 4 "bar" ))يُقيّم إلى . بالطبع، سيكون هذا أكثر فائدة لو تم استبدال التعبير بتعبير غير تافه بدلاً من .(34"bar")nil
توفر لغة ليسب أيضًا عوامل منطقية هي "و" و "أو " و" ليس" . يقوم العاملان " و" و "أو" بتقييم مختصر، حيث يُرجعان الوسيط الأول بقيمة فارغة (nil) والوسيط الأول بقيمة غير فارغة (non-nil) على التوالي.
( أو ( و "صفر" لا شيء "أبدًا" ) "جيمس" 'مهمة 'وقت )سيتم تقييمها إلى "جيمس".
تعبيرات لامدا وتعريف الدوال
يُستخدم عامل خاص آخر، lambda، لربط المتغيرات بالقيم التي تُقيّم لاحقًا ضمن تعبير. يُستخدم هذا العامل أيضًا لإنشاء الدوال: وسائط الدالة lambdaهي قائمة من الوسائط، والتعبير أو التعبيرات التي تُقيّمها الدالة (القيمة المُعادة هي قيمة آخر تعبير تم تقييمه).
( lambda ( arg ) ( + arg 1 ))يُقيّم التعبير إلى دالة، عند تطبيقها، تأخذ وسيطًا واحدًا، وتربطه برقم، argثم تُرجع العدد الأكبر من ذلك الوسيط بواحد. لا تُعامل تعابير لامدا بشكل مختلف عن الدوال المُسماة؛ إذ يتم استدعاؤها بنفس الطريقة. لذلك، فإن التعبير
(( lambda ( arg ) ( + arg 1 )) 5 )يتم تقييمها إلى 6. هنا، نقوم بتطبيق دالة: نقوم بتنفيذ الدالة المجهولة عن طريق تمرير القيمة 5 إليها.
يتم إنشاء الدوال المسماة عن طريق تخزين تعبير لامدا في رمز باستخدام ماكرو defun.
( ديفون فو ( أ ب ج د ) ( + أ ب ج د ))(defunf(a)b...)يُعرّف هذا الأمر دالة جديدة باسم معين fفي البيئة العامة. وهو مشابه من حيث المفهوم للتعبير التالي:
( setf ( fdefinition 'f ) #' ( lambda ( a ) ( block f b... )))يُستخدم الماكرو ` where` setfلتعيين قيمة الوسيط الأول لكائن دالة جديد. ` where` هو تعريف دالة عام للدالة المسماة ` .` هو اختصار لعامل خاص، يُعيد كائن دالة.fdefinition'ffdefinitionf#'function
الذرات
في لغة ليسب الأصلية، كان هناك نوعان أساسيان من البيانات : الذرات والقوائم. القائمة عبارة عن تسلسل مُرتب ومحدود من العناصر، حيث يكون كل عنصر إما ذرة أو قائمة، والذرة عبارة عن رقم أو رمز. الرمز هو في الأساس عنصر فريد مُسمى، يُكتب كسلسلة أبجدية رقمية في شفرة المصدر ، ويُستخدم إما كاسم متغير أو كعنصر بيانات في المعالجة الرمزية . على سبيل المثال، تحتوي القائمة على ثلاثة عناصر: الرمز ، والقائمة ، والرقم 2.(FOO(BAR1)2)FOO(BAR1)
المقارنات والقوائم

تُنفَّذ قائمة Lisp كقائمة مرتبطة أحادية . [ 67 ] تُسمى كل خلية في هذه القائمة cons (في Scheme، زوجًا ) وتتكون من مؤشرين ، يُسميان car و cdr . وهما مكافئان على التوالي للحقلين dataو nextالمذكورين في مقالة القائمة المرتبطة .
من بين العديد من هياكل البيانات التي يمكن بناؤها باستخدام خلايا cons، يُعدّ ما يُسمى بالقائمة الصحيحة أحد أبسطها . تتكون القائمة الصحيحة إما من nilالرمز الخاص (قائمة فارغة)، أو من cons حيث carيشير العنصر الأول إلى بيانات (والتي قد تكون بنية cons أخرى، مثل قائمة)، ويشير العنصر الثاني cdrإلى قائمة صحيحة أخرى.
إذا اعتُبر عنصر معين رأسًا لقائمة مرتبطة، فإنّ مؤشره car يشير إلى العنصر الأول في القائمة، بينما يشير مؤشره cdr إلى باقي عناصرها. ولهذا السبب، تُسمى الدالتان و أيضًا carعند الإشارة إلى عناصر تُشكّل جزءًا من قائمة مرتبطة (بدلًا من شجرة، على سبيل المثال).cdrfirstrest
لذا، فإن قائمة Lisp ليست كائنًا ذريًا، كما هو الحال مع مثيل فئة حاوية في C++ أو Java. القائمة ليست سوى مجموعة من العناصر المرتبطة. المتغير الذي يشير إلى قائمة معينة هو ببساطة مؤشر إلى أول عنصر في القائمة. يمكن اجتياز القائمة عن طريق تمرير عناصرها لأسفل؛ أي أخذ تمريرات متتالية لزيارة كل عنصر؛ أو باستخدام أي من الدوال العليا لرسم دالة على القائمة.
نظرًا لأن المجاميع والقوائم شائعة الاستخدام في أنظمة لغة ليسب، فمن الشائع الاعتقاد خطأً بأنها هياكل البيانات الوحيدة في ليسب. في الواقع، تحتوي جميع لغات ليسب، باستثناء أبسطها، على هياكل بيانات أخرى، مثل المتجهات ( المصفوفات )، وجداول التجزئة ، والهياكل، وما إلى ذلك.
تمثل التعبيرات S قوائم

تمثل تعابير S بين قوسين هياكل القوائم المتصلة. توجد عدة طرق لتمثيل القائمة نفسها كتعبير S. يمكن كتابة cons باستخدام ترميز الأزواج المنقطة على النحو التالي : ، حيث يمثل العنصر car و يمثل العنصر cdr. يمكن كتابة قائمة أطول باستخدام ترميز الأزواج المنقطة أيضًا. يُختصر هذا عادةً إلى في ترميز القوائم . يمكن كتابة قائمة غير صحيحة [ ملاحظة 3 ] باستخدام مزيج من الطريقتين - كما هو الحال بالنسبة لقائمة من ثلاثة عناصر cons حيث يكون العنصر cdr الأخير هو (أي القائمة في شكلها الكامل).(a.b)ab(a.(b.(c.(d.nil))))(abcd)(abc.d)d(a.(b.(c.d)))
إجراءات معالجة القوائم
توفر لغة ليسب العديد من الإجراءات المدمجة للوصول إلى القوائم والتحكم بها. يمكن إنشاء القوائم مباشرةً باستخدام listالإجراء، الذي يأخذ أي عدد من الوسائط، ويعيد قائمة بهذه الوسائط.
( list 1 2 'a 3 ) ; الناتج: (1 2 a 3)( القائمة 1 ' ( 2 3 ) 4 ) ;الناتج: (1 (2 3) 4)بسبب طريقة بناء القوائم من أزواج cons ، consيمكن استخدام هذا الإجراء لإضافة عنصر إلى بداية القائمة. consويتسم هذا الإجراء بعدم التناظر في طريقة تعامله مع وسائط القوائم، وذلك بسبب طريقة بناء القوائم.
( cons 1 ' ( 2 3 )) ;الناتج: (1 2 3)( cons ' ( 1 2 ) ' ( 3 4 )) ;الناتج: ((1 2) 3 4)تُلحق هذه appendالعملية قائمتين (أو أكثر) ببعضهما البعض. ولأن قوائم لغة ليسب هي قوائم مرتبطة، فإن إلحاق قائمتين لها تعقيد زمني تقاربي.
( أضف ' ( 1 2 ) ' ( 3 4 )) ; الناتج: (1 2 3 4)( أضف ' ( 1 2 3 ) ' () ' ( a ) ' ( 5 6 )) ; الناتج: (1 2 3 a 5 6)هيكل مشترك
يمكن لقوائم لغة ليسب، كونها قوائم مرتبطة بسيطة، أن تتشارك في البنية فيما بينها. بمعنى آخر، يمكن لقائمتين أن تشتركا في الذيل ، أو التسلسل النهائي للقيم. على سبيل المثال، بعد تنفيذ كود Common Lisp التالي:
( setf foo ( list 'a 'b 'c )) ( setf bar ( cons 'x ( cdr foo )))القائمتان fooو barهما و على التوالي. مع ذلك، فإنّ ذيل القائمة له نفس البنية في كلتا القائمتين. فهو ليس نسخة؛ إذ إنّ خلايا cons التي تشير إلى و موجودة في نفس مواقع الذاكرة لكلتا القائمتين.(abc)(xbc)(bc)bc
يمكن أن يؤدي استخدام بنية مشتركة بدلاً من نسخها إلى تحسين الأداء بشكل ملحوظ. مع ذلك، قد تتفاعل هذه التقنية بطرق غير مرغوب فيها مع الدوال التي تُعدّل القوائم المُمرّرة إليها كوسائط. فتغيير إحدى القوائم، مثل استبدال القائمة بقائمة cأخرى goose، سيؤثر على القائمة الأخرى.
( setf ( third foo ) 'goose )يتغير هذا fooإلى ، ولكن بالتالي يتغير أيضًا إلى - وهي نتيجة قد تكون غير متوقعة. قد يكون هذا مصدرًا للأخطاء، ولذلك تُوثَّق الدوال التي تُغيِّر وسائطها على أنها مُدمِّرة .(abgoose)bar(xbgoose)
يتجنب مُحبو البرمجة الوظيفية الدوال المُدمِّرة. في لهجة Scheme، التي تُفضِّل الأسلوب الوظيفي، تُعلَّم أسماء الدوال المُدمِّرة بعلامة تعجب تحذيرية، أو ما يُسمى "bang" - مثل set-car!(اقرأ set car bang )، التي تستبدل car في cons. أما في لهجة Common Lisp، فالدوال المُدمِّرة شائعة؛ set-car!ويُسمى ما يُعادلها rplacaبـ "replace car". مع ذلك، نادرًا ما تُستخدم هذه الدالة، لأن Common Lisp تتضمن ميزة خاصة، تُسمى setf، لتسهيل تعريف الدوال المُدمِّرة واستخدامها. من الأساليب الشائعة في Common Lisp كتابة الكود وظيفيًا (بدون استدعاءات مُدمِّرة) عند إنشاء النماذج الأولية، ثم إضافة الاستدعاءات المُدمِّرة كتحسين حيثما كان ذلك آمنًا.
استمارات التقييم الذاتي والاقتباس
تقوم لغة ليسب بتقييم التعبيرات التي يُدخلها المستخدم. تُقيّم الرموز والقوائم إلى تعبير آخر (أبسط عادةً) - على سبيل المثال، يُقيّم الرمز إلى قيمة المتغير الذي يُشير إليه؛ ويُقيّم إلى . مع ذلك، تُقيّم معظم الأشكال الأخرى إلى نفسها: إذا تم إدخالها في ليسب، فإنها تُرجع .(+23)555
يمكن أيضًا وضع علامة على أي تعبير لمنع تقييمه (كما هو ضروري للرموز والقوائم). هذا هو دور المعامل quoteالخاص، أو اختصاره '(علامة اقتباس واحدة). على سبيل المثال، عادةً عند إدخال الرمز foo، فإنه يُرجع قيمة المتغير المقابل (أو خطأً، إذا لم يكن هناك متغير بهذا الاسم). للإشارة إلى الرمز الحرفي، أدخل أو، عادةً، .(quotefoo)'foo
يدعم كل من Common Lisp وScheme عامل الاقتباس العكسي (المسمى شبه اقتباس في Scheme)، والذي يُدخل باستخدام `الحرف ( علامة تعجب خلفية ). وهو يُشبه إلى حد كبير الاقتباس العادي، إلا أنه يسمح بتقييم التعبيرات وإدراج قيمها في قائمة مُقتبسة باستخدام عاملي فك الاقتباس بالفاصلة وربط الفاصلة . إذا كانت قيمة المتغير هي ، فإن يُقيّم إلى ، بينما يُقيّم إلى . يُستخدم الاقتباس العكسي غالبًا في تعريف توسيعات الماكرو. [ 68 ] [ 69 ],,@snue(barbaz)`(foo,snue)(foo(barbaz))`(foo,@snue)(foobarbaz)
تُعدّ الصيغ ذاتية التقييم والصيغ المُقتبسة في لغة ليسب مُكافئة للقيم الحرفية. قد يكون من الممكن تعديل قيم القيم الحرفية (القابلة للتغيير) في كود البرنامج. على سبيل المثال، إذا أعادت دالة صيغة مُقتبسة، وقام الكود الذي يستدعي الدالة بتعديل هذه الصيغة، فقد يُغيّر ذلك سلوك الدالة عند استدعائها لاحقًا.
( defun should-be-constant () ' ( one two three ))( let (( stuff ( should-be-constant ))) ( setf ( third stuff ) 'bizarre )) ; bad!( يجب أن يكون ثابتًا ) ؛ يُرجع (واحد اثنان غريبان)يُعتبر تعديل شكل مُقتبس كهذا أسلوبًا سيئًا بشكل عام، ويتم تعريفه بواسطة ANSI Common Lisp على أنه خاطئ (مما يؤدي إلى سلوك "غير محدد" في الملفات المُجمَّعة، لأن مُجمِّع الملفات يمكنه دمج الثوابت المتشابهة، ووضعها في ذاكرة محمية ضد الكتابة، وما إلى ذلك).
وقد أشار دوغلاس هوفستاتر (في غودل، إيشر، باخ ) وآخرون إلى صياغة لغة ليسب للاقتباس كمثال على الفكرة الفلسفية للإشارة الذاتية .
النطاق والإغلاق
تنقسم عائلة لغات ليسب حول استخدام النطاق الديناميكي أو النطاق الثابت (أو المعجمي) . تستخدم لغات كلوجر، وكومون ليسب، وسكيم النطاق الثابت افتراضيًا، بينما تستخدم لغات نيو ليسب ، وبيكوليسب، واللغات المضمنة في إيماكس وأوتوكاد النطاق الديناميكي. ومنذ الإصدار 24.1، يستخدم إيماكس كلا النطاقين الديناميكي والمعجمي.
بنية قائمة التعليمات البرمجية للبرنامج؛ استغلالها بواسطة وحدات الماكرو والمترجمات
يتمثل أحد الفروق الأساسية بين لغة Lisp واللغات الأخرى في أن التمثيل النصي للبرنامج في لغة Lisp هو ببساطة وصف قابل للقراءة البشرية لنفس هياكل البيانات الداخلية (القوائم المرتبطة، والرموز، والأرقام، والأحرف، وما إلى ذلك) التي يستخدمها نظام Lisp الأساسي.
تستخدم لغة ليسب هذا لتنفيذ نظام ماكرو قوي للغاية. وكما هو الحال في لغات الماكرو الأخرى، مثل تلك المُعرَّفة بواسطة مُعالج ما قبل المعالجة C (مُعالج ما قبل المعالجة للغات البرمجة C و Objective-C و C++ )، يُعيد الماكرو شيفرةً قابلةً للترجمة. إلا أنه على عكس ماكرو مُعالج ما قبل المعالجة C، فإن ماكرو ليسب عبارة عن دوال ليسب، وبالتالي يُمكنه استغلال كامل إمكانيات ليسب.
علاوة على ذلك، ولأنّ بنية كود لغة ليسب تُشابه بنية القوائم، يُمكن إنشاء وحدات ماكرو باستخدام أيٍّ من دوال معالجة القوائم في اللغة. باختصار، أيّ شيء يُمكن لليسب فعله ببنية البيانات، يُمكن لوحدات ماكرو ليسب فعله بالكود. في المقابل، في معظم اللغات الأخرى، يكون مُخرَج المُحلِّل جزءًا داخليًا من تطبيق اللغة ولا يُمكن للمُبرمج التلاعب به.
تُسهّل هذه الميزة تطوير لغات فعّالة ضمن اللغات الأخرى. على سبيل المثال، يُمكن تطبيق نظام كائنات Common Lisp بسلاسة كامتداد للغة باستخدام وحدات الماكرو. هذا يعني أنه إذا احتاج تطبيق ما إلى آلية وراثة مختلفة، فبإمكانه استخدام نظام كائنات مختلف. وهذا يُخالف تمامًا معظم اللغات الأخرى؛ فمثلاً، لا تدعم Java الوراثة المتعددة، ولا توجد طريقة عملية لإضافتها.
في تطبيقات لغة ليسب البسيطة، يُفسَّر هيكل القائمة هذا مباشرةً لتشغيل البرنامج؛ فالدالة هي حرفيًا جزء من هيكل القائمة الذي يجتازه المفسر أثناء تنفيذه. مع ذلك، تتضمن معظم أنظمة ليسب المتطورة مُترجمًا. يُترجم المُترجم هيكل القائمة إلى لغة الآلة أو لغة البايت كود للتنفيذ. يمكن تشغيل هذا الكود بنفس سرعة الكود المُترجم بلغات تقليدية مثل لغة سي.
تتوسع وحدات الماكرو قبل خطوة الترجمة، مما يوفر خيارات مثيرة للاهتمام. فإذا احتاج البرنامج إلى جدول مُحسَب مسبقًا، فقد يقوم الماكرو بإنشاء الجدول أثناء الترجمة، وبالتالي لا يحتاج المُترجم إلا إلى إخراج الجدول دون الحاجة إلى استدعاء أي كود لإنشائه أثناء التشغيل. بل إن بعض تطبيقات لغة ليسب تتضمن آلية eval-whenتسمح بوجود الكود أثناء الترجمة (عندما يحتاجه الماكرو)، ولكن دون وجوده في الوحدة المُخرَجة. [ 70 ]
التقييم وحلقة القراءة والتقييم والطباعة
تُستخدم لغات ليسب غالبًا مع سطر أوامر تفاعلي ، والذي يمكن دمجه مع بيئة تطوير متكاملة (IDE). يقوم المستخدم بكتابة التعابير في سطر الأوامر، أو يوجه بيئة التطوير المتكاملة لإرسالها إلى نظام ليسب. يقرأ ليسب التعابير المُدخلة، ويُقيّمها ، ثم يطبع النتيجة. لهذا السبب، يُطلق على سطر أوامر ليسب اسم حلقة القراءة والتقييم والطباعة ( REPL ).
تتمثل آلية عمل بيئة التفاعل التفاعلي (REPL) الأساسية فيما يلي. هذا وصف مبسط يغفل العديد من عناصر لغة ليسب الحقيقية، مثل الاقتباسات والماكرو.
تقبل الدالة readتعابير S النصية كمدخلات، وتحللها إلى بنية بيانات داخلية. على سبيل المثال، إذا كتبت النص في موجه الأوامر، فستترجمه الدالة إلى قائمة مرتبطة بثلاثة عناصر: الرمز ، والرقم 1، والرقم 2. ومن المصادفة أن هذه القائمة هي أيضًا جزء صالح من كود Lisp؛ أي يمكن تقييمها. وذلك لأن العنصر الأول في القائمة يُشير إلى دالة - وهي عملية الجمع.(+12)read+
سيتم قراءة الحرف A fooكرمز واحد. 123سيتم قراءة الرقم 123 كرقم مئة وثلاثة وعشرين. "123"سيتم قراءة السلسلة "123".
تقوم الدالة evalبتقييم البيانات، وتعيد صفرًا أو أكثر من بيانات لغة ليسب كنتيجة. لا يعني التقييم بالضرورة التفسير؛ فبعض أنظمة ليسب تُترجم كل تعبير إلى لغة الآلة الأصلية. مع ذلك، من السهل وصف التقييم بأنه تفسير: لتقييم قائمة تحتوي على اسم دالة، evalيتم أولًا تقييم كل وسيط من الوسائط المُعطاة في تعريفها، ثم تُطبق الدالة على هذه الوسائط. في هذه الحالة، الدالة هي الجمع، وتطبيقها على قائمة الوسائط يُعطي الإجابة . هذه هي نتيجة التقييم.(12)3
يُقيّم الرمز fooإلى قيمة الرمز foo. تُقيّم بيانات مثل السلسلة "123" إلى السلسلة نفسها. تُقيّم القائمة إلى القائمة (1 2 3).(quote(123))
تتمثل مهمة الدالة printفي عرض المخرجات للمستخدم. بالنسبة لنتيجة بسيطة كهذه، 3يكون الأمر بسيطًا. أما التعبير الذي يُقيّم إلى جزء من بنية قائمة، فيتطلب printاجتياز القائمة وطباعتها كتعبير S.
لتنفيذ بيئة تفاعلية (REPL) للغة Lisp، يكفي تنفيذ هذه الدوال الثلاث ودالة حلقة لا نهائية. (بطبيعة الحال، evalسيكون تنفيذ هذه الدالة معقدًا، إذ يجب أن يشمل أيضًا جميع المعاملات الخاصة مثل if`or` lambda). بعد ذلك، تصبح بيئة التفاعل الأساسية سطرًا واحدًا من التعليمات البرمجية: `.(loop(print(eval(read))))
يوفر برنامج Lisp REPL عادةً أيضًا تحرير الإدخال، وسجل الإدخال، ومعالجة الأخطاء، وواجهة للمصحح.
عادةً ما يتم تقييم لغة ليسب بشكل فوري . في لغة كومون ليسب ، يتم تقييم الوسائط بترتيب تطبيقي ('الأيسر والأقرب إلى الداخل')، بينما في لغة سكيم يكون ترتيب الوسائط غير محدد، مما يترك مجالًا للتحسين بواسطة المترجم.
هياكل التحكم
كانت لغة ليسب في الأصل تحتوي على عدد قليل جدًا من هياكل التحكم، ولكن تمت إضافة المزيد منها خلال تطور اللغة. (يُعدّ عامل الشرط الأصلي في ليسب، cond، سلفًا if-then-elseللهياكل اللاحقة.)
كثيرًا ما يستخدم مبرمجو لغة Scheme التكرار الذيل للتعبير عن الحلقات . وقد دفع شيوع Scheme في علوم الحاسوب الأكاديمية بعض الطلاب إلى الاعتقاد بأن التكرار الذيل هو الطريقة الوحيدة، أو الأكثر شيوعًا، لكتابة التكرارات في لغة Lisp، لكن هذا غير صحيح. فجميع لهجات Lisp الشائعة تحتوي على بنيات تكرارية ذات نمط إجرائي، بدءًا من doحلقات Scheme وصولًا إلى التعبيرات المعقدة في Common Lisploop . علاوة على ذلك، فإن المسألة الأساسية التي تجعل هذا الأمر موضوعيًا لا ذاتيًا هي أن Scheme تضع متطلبات محددة للتعامل مع الاستدعاءات الذيلية ، وبالتالي فإن سبب تشجيع استخدام التكرار الذيل في Scheme هو أن تعريف اللغة يدعم هذه الممارسة صراحةً. في المقابل، لا تتطلب لغة ANSI Common Lisp [ 71 ] التحسين المعروف باسم حذف الاستدعاءات الذيلية. وبالتالي، فإن حقيقة أن أسلوب التكرار الذيل كبديل عرضي لاستخدام بنيات التكرار التقليدية (مثل do، dolistأو loop) غير مستحب [ 72 ] في Common Lisp ليس مجرد مسألة تفضيل أسلوبي، ولكنه قد يكون مسألة كفاءة (حيث أن استدعاء الذيل الظاهر في Common Lisp قد لا يتم تجميعه كقفزة بسيطة ) وصحة البرنامج (حيث أن التكرار الذيل قد يزيد من استخدام المكدس في Common Lisp، مما يعرض لخطر تجاوز سعة المكدس ).
بعض هياكل التحكم في لغة ليسب هي عوامل خاصة ، تعادل الكلمات المفتاحية النحوية في لغات أخرى. تتشابه التعبيرات التي تستخدم هذه العوامل ظاهريًا مع استدعاءات الدوال، لكنها تختلف عنها في أن الوسائط لا تُقيّم بالضرورة، أو قد تُقيّم أكثر من مرة في حالة تعبير التكرار.
على عكس معظم لغات البرمجة الرئيسية الأخرى، تسمح لغة ليسب بتنفيذ هياكل التحكم باستخدامها. يتم تنفيذ العديد من هياكل التحكم كوحدات ماكرو في ليسب، ويمكن للمبرمج الذي يرغب في معرفة كيفية عملها توسيعها باستخدام وحدات الماكرو.
تحتوي كل من لغتي Common Lisp وScheme على عوامل تحكم غير محلية. وتُعدّ الاختلافات في هذه العوامل من أبرز الفروقات بين اللغتين. تدعم Scheme الاستمراريات القابلة لإعادة الدخول باستخدام call/ccالإجراء، مما يسمح للبرنامج بحفظ (واستعادته لاحقًا) موضعًا محددًا في التنفيذ. بينما لا تدعم Common Lisp الاستمراريات القابلة لإعادة الدخول، إلا أنها تدعم عدة طرق للتعامل مع استمراريات الهروب.
في كثير من الأحيان، يمكن التعبير عن الخوارزمية نفسها في لغة ليسب إما بأسلوب إجرائي أو وظيفي. وكما ذُكر سابقًا، تميل لغة سكيم إلى تفضيل الأسلوب الوظيفي، باستخدام الاستدعاء الذاتي النهائي والاستمراريات للتعبير عن تدفق التحكم. ومع ذلك، يظل الأسلوب الإجرائي ممكنًا تمامًا. قد يبدو الأسلوب الذي يفضله العديد من مبرمجي كومون ليسب أكثر ألفةً للمبرمجين المعتادين على اللغات المهيكلة مثل لغة سي، بينما يشبه الأسلوب الذي يفضله مبرمجو سكيم اللغات الوظيفية البحتة مثل لغة هاسكل .
بفضل إرث لغة ليسب المبكر في معالجة القوائم، فهي تمتلك مجموعة واسعة من الدوال عالية الرتبة المتعلقة بالتكرار على المتتاليات. في كثير من الحالات التي تتطلب فيها لغات أخرى استخدام حلقة تكرار صريحة (مثل forحلقة التكرار في لغة C)، يمكن في ليسب إنجاز المهمة نفسها باستخدام دالة عالية الرتبة. (وينطبق الأمر نفسه على العديد من لغات البرمجة الوظيفية).
من الأمثلة الجيدة على ذلك دالة تُسمى في لغة Scheme mapوتُسمى في لغة Common Lisp mapcar. عند إعطاء دالة وقائمة واحدة أو أكثر، mapcarتُطبق الدالة تباعًا على عناصر القوائم بالترتيب، وتُجمع النتائج في قائمة جديدة.
( ماب كار #' + ' ( 1 2 3 4 5 ) ' ( 10 20 30 40 50 ))هذا يطبق +الدالة على كل زوج متناظر من عناصر القائمة، مما ينتج عنه النتيجة .(1122334455)
أمثلة
فيما يلي أمثلة على كود Common Lisp.
البرنامج الأساسي " مرحباً بالعالم! ":
( اطبع "مرحباً بالعالم!" )تُسهّل بنية لغة ليسب استخدام الاستدعاء الذاتي بشكل طبيعي. فالمسائل الرياضية، مثل تعداد المجموعات المُعرّفة بشكل استدعائي، يسهل التعبير عنها بهذه الصيغة. على سبيل المثال، لحساب مضروب عدد ما :
( مضروب إلغاء ( n ) ( إذا ( صفر n ) 1 ( * n ( مضروب ( 1- n )))))يتطلب التنفيذ البديل مساحة أقل في الذاكرة من الإصدار السابق إذا كان نظام Lisp الأساسي يعمل على تحسين الاستدعاء الذاتي النهائي :
( defun factorial ( n &optional ( acc 1 )) ( if ( zerop n ) acc ( factorial ( 1- n ) ( * acc n ))))قارن الأمثلة أعلاه بنسخة تكرارية تستخدم ماكرو Common Lisp loop:
( defun factorial ( n ) ( loop for i from 1 to n for fac = 1 then ( * fac i ) finally ( return fac )))تقوم الدالة التالية بعكس ترتيب عناصر القائمة. ( تقوم دالة العكس المدمجة في لغة ليسب بنفس الشيء.)
( defun -reverse ( list ) ( let (( return-value )) ( dolist ( e list ) ( push e return-value )) return-value ))أنظمة الكائنات
تم بناء أنظمة ونماذج كائنية متنوعة فوق لغة ليسب أو بجانبها أو داخلها، بما في ذلك
- يُعد نظام كائنات Common Lisp ، أو CLOS، جزءًا لا يتجزأ من ANSI Common Lisp. وقد انحدر CLOS من New Flavors و CommonLOOPS. وكانت ANSI Common Lisp أول لغة برمجة كائنية التوجه موحدة (1994، ANSI X3J13).
- لغة ObjectLisp [ 73 ] أو Object Lisp ، المستخدمة من قبل شركة Lisp Machines Incorporated والإصدارات المبكرة من لغة Macintosh Common Lisp
- نظام LOOPS (نظام برمجة كائنية التوجه بلغة Lisp) ونظام CommonLoops اللاحق
- Flavors ، الذي تم بناؤه في معهد ماساتشوستس للتكنولوجيا ، ونسله New Flavors (الذي طورته Symbolics ).
- KR (اختصار لـ Knowledge Representation)، وهو نظام كائنات قائم على القيود تم تطويره للمساعدة في كتابة Garnet، وهي مكتبة واجهة المستخدم الرسومية للغة Common Lisp .
- استخدمت بيئة هندسة المعرفة (KEE) نظام كائنات يسمى UNITS ودمجته مع محرك استدلال [ 74 ] ونظام صيانة الحقيقة (ATMS).
أنظمة التشغيل
تعتمد العديد من أنظمة التشغيل ، بما في ذلك الأنظمة القائمة على اللغات ، على لغة ليسب (تستخدم ميزات ليسب، واتفاقياتها، وأساليبها، وهياكل بياناتها، وما إلى ذلك)، أو مكتوبة بلغة ليسب، [ 75 ] بما في ذلك:
Genera ، التي أعيد تسميتها إلى Open Genera، [ 76 ] بواسطة Symbolics ؛ Medley، المكتوبة بلغة Interlisp، وهي في الأصل عائلة من أنظمة التشغيل الرسومية التي كانت تعمل على محطات عمل Star اللاحقة من Xerox ؛ [ 77 ] [ 78 ] Mezzano؛ [ 79 ] Interim؛ [ 80 ] [ 81 ] ChrysaLisp، [ 82 ] بواسطة مطوري TAOS من Tao Systems؛ [ 83 ] وأيضًا نظام Guix لنظام GNU/Linux.
انظر أيضاً
الحواشي
- ↑ في ذلك الوقت، كانت لغة فورتران تحتوي على بنية if-then-else التي تقبل أرقام الأسطر كأهداف للقفز، على غرار عبارة Goto ، بدلاً من قبول تعبيرات عشوائية في كتل "then" و"else".
- ↑ لغة Common Lisp:
(defun f (x) x)لغة Scheme:(define f (lambda (x) x))أو(define (f x) x) - ملاحظة : ما يُسمى بـ"القائمة المنقطة" هو نوع واحد فقط من "القوائم غير الصحيحة". النوع الآخر هو "القائمة الدائرية" حيث تُشكّل خلايا cons حلقة. عادةً ما يتم تمثيل ذلك باستخدام
#n=(...)لتمثيل خلية cons المستهدفة التي سيكون لها مراجع متعددة، ويُستخدم#n#للإشارة إلى هذه الخلية. على سبيل المثال،(#1=(a b) . #1#)عادةً ما تُطبع كـ((a b) a b)(بدون تمكين طباعة البنية الدائرية)، ولكن هذا يُوضح إعادة استخدام خلية cons.#1=(a . #1#)لا يمكن عادةً طباعة لأنها دائرية، على الرغم من(a...)أنه يتم عرضها أحيانًا، فإن CDR لخلية cons المُعرّفة بواسطة#1=هو نفسه.
مراجع
- ↑ "مقدمة" . دليل جوليا . اقرأ الوثائق. مؤرشف من الأصل بتاريخ 8 أبريل 2016. تم الاطلاع عليه بتاريخ 10 ديسمبر 2016 .
- ↑ "أسئلة وأجوبة حول لغة وولفرام" . بحث وولفرام . تم الاطلاع عليه بتاريخ 10-12-2016 .
- ↑ إدوين د. رايلي (2003). معالم بارزة في علوم الحاسوب وتكنولوجيا المعلومات . مجموعة غرينوود للنشر. الصفحات 156-157 . ISBN 978-1-57356-521-9.
- ↑ "SICP: مقدمة" . مؤرشف من الأصل بتاريخ 27 يوليو 2001.
لغة ليسب لغةٌ باقية، إذ استُخدمت لما يقارب ربع قرن. ومن بين لغات البرمجة النشطة، لم تدم أطول منها سوى لغة فورتران.
- ↑ "الاستنتاجات" . مؤرشف من الأصل بتاريخ 2014-04-03 . تم الاطلاع عليه بتاريخ 2014-06-04 .
- ↑ ستيل، جاي ل. (1990). لغة ليسب الشائعة: اللغة ( الطبعة الثانية). بيدفورد، ماساتشوستس: دار النشر الرقمية. ISBN 1-55558-041-6. OCLC 20631879 .
- ^ فيليسن، ماتياس. فيندلر، روبرت؛ فلات، ماثيو. كريشنامورثي، شريرام؛ بارزيلاي، إيلي؛ مكارثي، جاي. توبين هوتشستات، سام (2015). ""بيان الابتزاز"( PDF) .
- ↑ "كلوجر - الاختلافات مع لغات ليسب الأخرى" . clojure.org . تم الاطلاع عليه بتاريخ 27-10-2022 .
- ↑ ستيل، جاي لويس؛ سوسمان، جيرالد جاي (مايو 1978). "فن المفسر، أو مُركّب النمطية (الأجزاء صفر، وواحد، واثنان)، الجزء صفر، ص 4" . مكتبات معهد ماساتشوستس للتكنولوجيا. hdl : 1721.1/6094 . تاريخ الاسترجاع : 1 أغسطس 2020 .
- ↑ هوفستاتر، دوغلاس ر. (1999) [1979]، غودل، إيشر، باخ: ضفيرة ذهبية أبدية (طبعة الذكرى العشرين) ، بيسيك بوكس، ص 292، ISBN 0-465-02656-7تُعدّ
لغة LISP (اختصارًا لـ "معالجة القوائم") واحدة من أهم لغات البرمجة وأكثرها إثارة للاهتمام، وقد ابتكرها جون مكارثي في نفس الفترة التي تم فيها ابتكار لغة Algol. وقد حظيت LISP بشعبية واسعة بين العاملين في مجال الذكاء الاصطناعي.
- ↑ بول غراهام. "انتقام المهووسين" . تم الاسترجاع في 14 مارس 2013 .
- ↑ تشيسنال، ديفيد (2011-01-12). لغات البرمجة المؤثرة، الجزء 4: لغة ليسب .
- ↑ جونز، روبن؛ ماينارد، كلايف؛ ستيوارت، إيان (6 ديسمبر 2012). فن برمجة لغة ليسب . سبرينغر ساينس آند بيزنس ميديا. ص 2. ISBN 9781447117193.
- 1 2 3 4 مكارثي، جون؛ ويكسلبلات، ريتشارد ل. (1978). تاريخ لغات البرمجة . رابطة آلات الحوسبة. ص 173-183 . ISBN 0127450408.
- ↑ سميث، ديفيد كانفيلد. دليل مستخدمي MLISP (ملف PDF) . تم الاطلاع عليه بتاريخ 13-10-2006 .
- ↑ مكارثي، جون (12 فبراير 1979). "تاريخ لغة ليسب: مختبر الذكاء الاصطناعي" (PDF) .
- ↑ ستويان، هربرت (6 أغسطس 1984). تاريخ لغة ليسب المبكر (1956-1959) . LFP '84: وقائع ندوة ACM لعام 1984 حول لغة ليسب والبرمجة الوظيفية. رابطة آلات الحوسبة . ص 307. doi : 10.1145/800055.802047 .
- ↑ مكارثي، جون. "تاريخ ما قبل LISP - من صيف 1956 إلى صيف 1958" . تم الاسترجاع في 14 مارس 2010 .
- ↑ مكارثي، جون (1960). "الدوال التكرارية للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول" . مجلة اتصالات رابطة آلات الحوسبة . 3 (4). رابطة آلات الحوسبة: 184-195 . doi : 10.1145/367177.367199 . تاريخ الاسترجاع: 28 فبراير 2025 .
- ↑ مكارثي، جون. "الدوال التكرارية للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول" . مؤرشف من الأصل بتاريخ 4 أكتوبر 2013. تم الاطلاع عليه بتاريخ 13 أكتوبر 2006 .
- ↑ هارت، تيم؛ ليفين، مايك. "مذكرة الذكاء الاصطناعي رقم 39 - المترجم الجديد" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2017-07-06 . تم الاطلاع عليه بتاريخ 2019-03-18 .
- ↑ مكارثي، جون؛ أبراهامز، بول دبليو؛ إدواردز، دانيال جيه؛ هارت، تيموثي بي؛ ليفين، مايكل آي. (1985) [1962]. دليل مبرمج لغة ليسب 1.5 (ملف PDF) . الطبعة الخامسة عشرة ( الطبعة الثانية). ص. مقدمة.
- ↑ تأثر حجم الكلمة البالغ 36 بت في جهازي PDP-6 و PDP-10 بفائدة وجود مؤشرين من نوع Lisp بحجم 18 بت في كلمة واحدة. بيتر ج. هيرلي (18 أكتوبر 1990). "تاريخ TOPS أو الحياة في أجهزة AC السريعة" . مجموعة الأخبار : alt.folklore.computers . يوزنت: 84950@tut.cis.ohio-state.edu .
بدأ مشروع PDP-6 في أوائل عام 1963، كجهاز ذي 24 بت. ثم نما إلى 36 بت من أجل لغة LISP، وهو هدف تصميمي.
- ↑ ستيل، جاي إل؛ غابرييل، ريتشارد بي (يناير 1996)، "تطور لغة ليسب"، في بيرجين، توماس جيه؛ جيبسون، ريتشارد جي (محرران)، تاريخ لغات البرمجة - الجزء الثاني ، نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM، الصفحات 233-330 ، doi : 10.1145/234286.1057818 ، ISBN 978-0-201-89502-5
- ↑ مكارثي، ج .؛ برايتون، ر.؛ إدواردز، د.؛ فوكس، ب .؛ هودز، ل .؛ لوكهام، د.؛ مالينغ، ك.؛ بارك، د .؛ راسل، س. (مارس 1960). دليل مبرمجي لغة ليسب 1 (ملف PDF) . بوسطن: مجموعة الذكاء الاصطناعي، مركز الحوسبة ومختبر الأبحاث في معهد ماساتشوستس للتكنولوجيا. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 17 يوليو 2010.تم الاطلاع عليه بتاريخ 11 مايو 2010.
- ↑ مكارثي، جون؛ أبراهامز، بول دبليو؛ إدواردز، دانيال جيه؛ هارت، تيموثي بي؛ ليفين، مايكل آي. (1985) [1962]. دليل مبرمج لغة ليسب 1.5 (ملف PDF) ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا . رقم ISBN 0-262-13011-4.
- ↑ كوام، لين هـ.؛ ديفل، ويتفيلد. دليل ستانفورد ليسب 1.6 (ملف PDF) .
- ↑ "دليل مرجعي لـ Maclisp" . 3 مارس 1979. مؤرشف من الأصل في 14 ديسمبر 2007.
- ↑ تيتلمان، وارن (1974). دليل مرجعي للغة إنترليسب (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 2006-06-02 . تم الاطلاع عليه بتاريخ 2006-08-19 .
- ↑ أدوات إنشاء الواجهات : حالة الفن والتصنيف بواسطة ح. المرابط
- ↑ جيرالد جاي سوسمان وجاي لويس ستيل الابن (ديسمبر 1975). "سكيم: مترجم لحساب لامدا الموسع" (ملف PDF) . مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . AIM-349 . تاريخ الاسترجاع: 23 ديسمبر 2021 .
- ↑ ستيل، جاي إل. الابن (1990). "الغرض" . لغة كومون ليسب ( الطبعة الثانية). دار النشر الرقمية. رقم ISBN 0-13-152414-3.
- ↑ كانترويتز، مارك؛ مارغولين، باري (20 فبراير 1996). "التاريخ: من أين أتت لغة ليسب؟" . الأسئلة الشائعة: أسئلة متكررة حول لغة ليسب 2/7 .
- ↑ "ISO/IEC 13816:1997" . Iso.org. 2007-10-01 . تم الاطلاع عليه بتاريخ 2013-11-15 .
- ↑ "ISO/IEC 13816:2007" . Iso.org. 2013-10-30 . تم الاطلاع عليه بتاريخ 2013-11-15 .
- ↑ "X3J13 Charter" .
- ↑ "استطلاع الطريق إلى لغة الليسب" . مؤرشف من الأصل بتاريخ 4 أكتوبر 2006. تم الاطلاع عليه بتاريخ 13 أكتوبر 2006 .
- ↑ "اتجاهات المستقبل" . Faqs.org. مؤرشف من الأصل بتاريخ 2013-06-03 . تم الاطلاع عليه بتاريخ 2013-11-15 .
- ↑ واينريب، دانيال. "تطبيقات لغة ليسب الشائعة: دراسة استقصائية" . مؤرشف من الأصل بتاريخ 21 أبريل 2012. تم الاطلاع عليه بتاريخ 4 أبريل 2012 .
- ↑ "Planet Lisp" . تم الاطلاع عليه بتاريخ 12-10-2023 .
- ↑ "LispForum" . تم الاطلاع عليه بتاريخ 12-10-2023 .
- ↑ "وظائف لغة ليسب" . تم الاطلاع عليه بتاريخ 12-10-2023 .
- ↑ "Quicklisp" . تم الاطلاع عليه بتاريخ 12-10-2023 .
- ^ "LISP50@OOPSLA" . ليسب50.org . تم الاسترجاع 2013/11/15 .
- ↑ الوثائق: المعايير: R5RS . schemers.org (2012-01-11). تم الاطلاع عليه بتاريخ 2013-07-17.
- ↑ «لماذا يستخدم معهد ماساتشوستس للتكنولوجيا الآن لغة بايثون بدلاً من لغة سكيم في برنامج علوم الحاسوب الجامعي؟» cemerick.com . 24 مارس 2009. مؤرشف من الأصل في 17 سبتمبر 2010. تم الاطلاع عليه في 10 نوفمبر 2013 .
- ↑ برودر، إيفان (8 يناير 2008). "نهاية حقبة" . mitadmissions.org . تم الاطلاع عليه في 10 نوفمبر 2013 .
- ↑ "برامج البكالوريوس في قسم الهندسة الكهربائية وعلوم الحاسوب في معهد ماساتشوستس للتكنولوجيا" . www.eecs.mit.edu . قسم الهندسة الكهربائية وعلوم الحاسوب في معهد ماساتشوستس للتكنولوجيا . تاريخ الاسترجاع: 31 ديسمبر 2018 .
- ↑ "دورة بايثون التمهيدية في معهد ماساتشوستس للتكنولوجيا تصل إلى 1.2 مليون مسجل" . قسم الهندسة الكهربائية وعلوم الحاسوب في معهد ماساتشوستس للتكنولوجيا . مؤرشف من الأصل بتاريخ 25 فبراير 2021. تم الاطلاع عليه بتاريخ 31 ديسمبر 2018 .
- ↑ الفصل 1.1.2، التاريخ، معيار ANSI CL
- ↑Clasp هو تطبيق Common Lisp يتفاعل مع C++ ويستخدم LLVM للترجمة في الوقت المناسب (JIT) إلى التعليمات البرمجية الأصلية.
- ↑"Armed Bear Common Lisp (ABCL) هو تطبيق كامل للغة Common Lisp يتميز بوجود مترجم ومترجم، ويعمل في JVM"
- ↑مؤرشف بتاريخ ٢٢ يونيو ٢٠١٨ في أرشيف الإنترنت (Wayback Machine) - تطبيقات لغة Common Lisp: دراسة استقصائية
- ↑مقارنة بين تطبيقات لغة Common Lisp التي يتم تطويرها بنشاط
- ↑ نظرة معمقة على مجموعات Clojure ، تم الاطلاع عليه بتاريخ 24-06-2012
- ↑ "Clojure rational" . تم الاطلاع عليه بتاريخ 27 أغسطس 2019.
Clojure هي لغة Lisp غير مقيدة بالتوافق مع الإصدارات السابقة
. - ↑ Script-fu في GIMP 2.4 ، تم الاطلاع عليه بتاريخ 29-10-2009
- ↑ librep في Sawfish Wikia، تم استرجاعه في 29-10-2009
- ↑ "IEEE Scheme" . IEEE 1178-1990 - معيار IEEE للغة برمجة Scheme . تم الاطلاع عليه بتاريخ 27 أغسطس 2019 .
- ↑ بول غراهام (مايو 2002). "ما الذي جعل لغة Lisp مختلفة" .
- ↑ "تاريخ لغة ليسب - من صيف 1956 إلى صيف 1958" .
لقد ابتكرتُ التعبيرات الشرطية في سياق مجموعة من إجراءات نقل الحركة القانونية في الشطرنج التي كتبتها بلغة فورتران لجهاز IBM 704 في معهد ماساتشوستس للتكنولوجيا خلال الفترة 1957-1958
... أُرسلت ورقة بحثية تُعرّف التعبيرات الشرطية وتقترح استخدامها في لغة ألغول إلى مجلة اتصالات جمعية آلات الحوسبة، ولكن تم تخفيض رتبتها بشكل تعسفي إلى رسالة إلى المحرر، لأنها كانت قصيرة جدًا.
- ↑ "معنى 'البرمجة كائنية التوجه' وفقًا للدكتور آلان كاي" . 23-07-2003.
لم أكن أفهم حينها فكرة لغة ليسب المعقدة عن اللغة الوصفية الملموسة، لكنني اقتربت نوعًا ما من فهمها من خلال أفكار حول اللغات القابلة للتوسيع
... تمثلت المرحلة الثانية في فهم ليسب أخيرًا، ثم استخدام هذا الفهم لإنشاء هياكل أساسية أصغر حجمًا وأكثر قوة وأكثر دقة في الربط المتأخر
... بالنسبة لي، تعني البرمجة كائنية التوجه فقط المراسلة، والاحتفاظ المحلي بالحالة والعملية وحمايتها وإخفائها، والربط المتأخر للغاية لجميع العناصر. يمكن تطبيق ذلك في سمول توك وليسب. ربما توجد أنظمة أخرى تسمح بذلك، لكنني لست على دراية بها.
- ↑ ليبرمان، هنري؛ هيويت، كارل (يونيو 1983)، "جامع قمامة في الوقت الحقيقي يعتمد على دورات حياة الكائنات" ، اتصالات ACM ، 26 (6): 419-429 ، CiteSeerX 10.1.1.4.8633 ، doi : 10.1145/358141.358147 ، hdl : 1721.1/6335 ، S2CID 14161480
- ↑ إدسكار دبليو. ديجكسترا (1972)، المبرمج المتواضع (EWD 340)(محاضرة جائزة تورينج من جمعية آلات الحوسبة).
- ↑ "نظرة على لغة كلوجر وعودة لغة ليسب" .
- ↑ "ملف المصطلحات - لغة ليسب" . تم الاطلاع عليه بتاريخ 13-10-2006 .
- ^ سيبيستا، روبرت دبليو (2012). ""2.4 البرمجة الوظيفية: لغة ليسب"؛ "6.9 أنواع القوائم"؛ "15.4 أول لغة برمجة وظيفية: لغة ليسب"مفاهيم لغات البرمجة (مطبوع) (الطبعة العاشرة ) . بوسطن، ماساتشوستس، الولايات المتحدة الأمريكية: أديسون-ويسلي. الصفحات 47-52 ، 281-284 ، 677-680 . ISBN 978-0-13-139531-2.
- ↑ "CSE 341: Scheme: Quote, Quasiquote, and Metaprogramming" . قسم علوم وهندسة الحاسوب، جامعة واشنطن. شتاء 2004. تاريخ الاسترجاع: 15 نوفمبر 2013 .
- ↑ باودن، آلان. "الاقتباس شبه الكامل في لغة ليسب" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2013-06-03.
- ↑ " وقت التقييم (امتدادات لغة Common Lisp) ". GNU. تم الاطلاع عليه بتاريخ 17-07-2013.
- ↑ 3.2.2.3 القيود الدلالية في Common Lisp HyperSpec
- ↑ 4.3. تجريد التحكم (الاستدعاء الذاتي مقابل التكرار) في برنامج تعليمي حول أسلوب برمجة Lisp الجيد من تأليف كينت بيتمان وبيتر نورفيج ، أغسطس 1993.
- ↑ الصفحة 17 من كتاب بوبرو 1986
- ↑ فيتش، ص 108، 1988
- ↑ بروفن، ليام (29 مارس 2022). "العالم الجامح لأنظمة التشغيل غير المكتوبة بلغة C" . ذا ريجستر . تم الاسترجاع في 4 أبريل 2024 .
- ↑ "Symbolics Open Genera 2.0" . أرشيف الإنترنت على GitHub . 7 يناير 2020. تم الاطلاع عليه بتاريخ 2 فبراير 2022 .
- ↑ "مشروع Interlisp.org" . Interlisp.org . 15 مارس 2022. تم الاطلاع عليه بتاريخ 2022-02-02 .
- ↑ "مزيج Interlisp" . GitHub . مارس 2022. تم الاسترجاع في 2022-02-02 .
- ↑ froggey (1 أغسطس 2021). "Mezzano" . GitHub . تم الاسترجاع في 2022-02-02 .
- ↑ هارتمان، لوكاس ف. (10 سبتمبر 2015). "مؤقت" . Interim-os . تم الاسترجاع في 2022-02-02 .
- ↑ هارتمان، لوكاس ف. (11 يونيو 2021). "مؤقت" . جيت هاب . تم الاسترجاع في 2 فبراير 2022 .
- ↑ هينسلي، كريس (23 فبراير 2022). "ChrysaLisp" . جيت هاب . تم الاسترجاع في 2022-02-02 .
- ↑ سميث، توني (21 أغسطس 2013). "كريس شيلتون، رائد الحواسيب الصغيرة في المملكة المتحدة: العقل المدبر وراء ناسكوم 1" . ذا ريجستر . تاريخ الاسترجاع: 2 فبراير 2022 .
للمزيد من القراءة
- مكارثي، جون (12 فبراير 1979). "تطبيق لغة ليسب" . تاريخ ليسب . جامعة ستانفورد . تاريخ الاسترجاع: 17 أكتوبر 2008 .
- ستيل الابن، جاي إل؛ ريتشارد ب. غابرييل (1993). تطور لغة ليسب (ملف PDF) . المؤتمر الثاني لجمعية ACM SIGPLAN حول تاريخ لغات البرمجة. نيويورك، نيويورك: ACM. الصفحات 231-270 . ISBN 0-89791-570-4أُرشف من النسخة الأصلية (PDF) بتاريخ 12 أكتوبر 2006. تم الاطلاع عليه بتاريخ 17 أكتوبر 2008 .
- فيتش، جيم (1998). "تاريخ ووصف لغة CLOS". في سالوس، بيتر هـ. (محرر). دليل لغات البرمجة . المجلد الرابع، لغات البرمجة الوظيفية والمنطقية ( الطبعة الأولى). إنديانابوليس، إنديانا: ماكميلان للنشر التقني. الصفحات 107-158 . ISBN 1-57870-011-6.
- أبيلسون، هارولد ؛ سوسمان، جيرالد جاي ؛ سوسمان، جولي (1996). بنية وتفسير برامج الحاسوب ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 0-262-01153-0.
- تجاربي مع لغة ليسب وتطوير برنامج جنو إيماكس ، نص خطاب ريتشارد ستالمان ، 28 أكتوبر 2002، في المؤتمر الدولي للغة ليسب
- غراهام، بول (2004). المخترقون والرسامون: أفكار عظيمة من عصر الحاسوب . أورايلي. ISBN 0-596-00662-4.
- بيركلي، إدموند سي .؛ بوبرو، دانيال جي. ، محرران. (مارس 1964). لغة البرمجة ليسب: تشغيلها وتطبيقاتها (ملف PDF) . كامبريدج، ماساتشوستس: مطبعة معهد ماساتشوستس للتكنولوجيا.
- يستند هذا المقال بشكل كبير إلى فصل "مقدمة بسيطة إلى لغة ليسب" من كتاب : بيركلي، إدموند سي. (سبتمبر 1964). "لغة البرمجة ليسب: مقدمة وتقييم" . مجلة الحوسبة والأتمتة : 16-23 .
- وايزمان، كلارك (1967). مقدمة في لغة ليسب 1.5 (ملف PDF) . بلمونت، كاليفورنيا: شركة ديكنسون للنشر.
روابط خارجية
- تاريخ
- تاريخ التلعثم – تاريخ جون مكارثي بتاريخ 12 فبراير 1979
- تاريخ لغة ليسب – تاريخ هربرت ستويان الذي تم تجميعه من الوثائق (يعترف مكارثي بأنه أكثر اكتمالاً من تاريخه الخاص، انظر: روابط تاريخ مكارثي )
- تاريخ لغة ليسب في متحف تاريخ الحاسوب
- بيل، آدم جوردون (2 مايو 2022). لغة ليسب في الفضاء، مع رون جاريت . كوريكرسيف (بودكاست، نص مكتوب، صور).حول استخدام برنامج LISP على روبوتات ناسا .
- كاسيل، ديفيد (22 مايو 2022). "مبرمج ناسا يتذكر تصحيح أخطاء لغة ليسب في الفضاء السحيق" . ذا نيو ستاك .
- الجمعيات والاجتماعات
- الكتب والدروس التعليمية
- إنشاء رموز SPEL في لغة Lisp ، درس تمهيدي بأسلوب القصص المصورة
- كتاب مجاني بعنوان " On Lisp" من تأليف بول غراهام
- برنامج Common Lisp العملي ، إصدار مجاني من تأليف بيتر سيبل
- لغة ليسب للويب
- أرض اللثغة
- دع لامدا
- المقابلات
- مقابلة تاريخية شفهية مع جون مكارثي في معهد تشارلز باباج ، جامعة مينيسوتا، مينيابوليس. يتحدث مكارثي عن دوره في تطوير نظام المشاركة الزمنية في معهد ماساتشوستس للتكنولوجيا. كما يصف عمله في مجال الذكاء الاصطناعي، الممول من وكالة مشاريع الأبحاث المتقدمة، بما في ذلك الذكاء الاصطناعي القائم على المنطق (LISP) والروبوتات.
- مقابلة مع ريتشارد ب. غابرييل (بودكاست)
- موارد
- كليكي: موسوعة لغة ليسب الشائعة
- دليل لغة Common Lisp (عبر Wayback Machine ؛ مؤرشف من الأصل )
- فهرس الأسئلة الشائعة حول لغة ليسب
- تمت أرشفة lisppaste بتاريخ 9 يونيو 2021 في Wayback Machine
- بلانيت ليسب
- أخبار التلعثم الأسبوعية
- نيو ليسب - لغة برمجة نصية حديثة ومتعددة الأغراض
- لَسْب ويكلي
- لغة البرمجة ليسب
- لغات البرمجة الأكاديمية
- الاختراعات الأمريكية
- لغات البرمجة ذات الكتابة الديناميكية
- لغات برمجة ذات بنية قابلة للتوسيع
- اللغات الوظيفية
- عائلة لغات البرمجة ليسب
- لغات البرمجة
- لغات البرمجة التي تم إنشاؤها عام 1958
