لغة الشفرة الشائعة
لغة Common Lisp ( CL ) هي لهجة من لغة برمجة Lisp ، نُشرت في وثيقة معيار المعهد الوطني الأمريكي للمعايير (ANSI) ANSI INCITS 226-1994 (S2018) [ 1 ] (سابقًا X3.226-1994 (R1999) ). [ 2 ] وقد تم اشتقاق Common Lisp HyperSpec ، وهي نسخة HTML مرتبطة تشعبيًا ، من معيار ANSI Common Lisp. [ 3 ]
طُوِّرت لغة Common Lisp كخليفة مُوحَّدة ومُحسَّنة للغة Maclisp . وبحلول أوائل ثمانينيات القرن العشرين، كانت عدة مجموعات تعمل بالفعل على تطوير لغات بديلة متنوعة للغة MacLisp، مثل: Lisp Machine Lisp (المعروفة أيضًا باسم ZetaLisp)، و Spice Lisp ، و NIL، و S-1 Lisp . سعت Common Lisp إلى توحيد وتوحيد وتوسيع ميزات هذه اللهجات من MacLisp. Common Lisp ليست تطبيقًا، بل هي مواصفات للغة . [ 4 ] تتوفر العديد من تطبيقات معيار Common Lisp، بما في ذلك البرامج المجانية والمفتوحة المصدر والمنتجات الاحتكارية. [ 5 ] Common Lisp هي لغة برمجة متعددة الأغراض ومتعددة الأنماط . تدعم مزيجًا من أنماط البرمجة الإجرائية والوظيفية والموجهة للكائنات . وبصفتها لغة برمجة ديناميكية ، فإنها تُسهِّل تطوير البرمجيات التطوري والتراكمي ، مع ترجمة تكرارية إلى برامج فعالة في وقت التشغيل. غالبًا ما يتم هذا التطوير التراكمي بشكل تفاعلي دون مقاطعة التطبيق قيد التشغيل.
كما يدعم هذا النظام إضافة تعليقات توضيحية اختيارية للأنواع وتحويلها، والتي يمكن إضافتها حسب الحاجة في مراحل التحليل والتحسين اللاحقة، لتمكين المُصرّف من توليد شيفرة أكثر كفاءة. على سبيل المثال، fixnumيمكن تخزين عدد صحيح غير مُغلّف ضمن نطاق يدعمه الجهاز والتنفيذ، مما يسمح بإجراء عمليات حسابية أكثر كفاءة من تلك التي تُجرى على الأعداد الصحيحة الكبيرة أو أنواع البيانات ذات الدقة العشوائية. وبالمثل، يمكن تحديد مستوى الأمان المطلوب للمُصرّف، على أساس كل وحدة أو دالة، باستخدام تعريفات التحسين .
تتضمن لغة Common Lisp نظام CLOS ، وهو نظام كائنات يدعم الأساليب المتعددة ومجموعات الأساليب. وغالبًا ما يتم تنفيذه باستخدام بروتوكول Metaobject .
لغة Common Lisp قابلة للتوسيع من خلال ميزات قياسية مثل وحدات Lisp الكلية (تحويلات التعليمات البرمجية) ووحدات القراءة الكلية (محللات الإدخال للأحرف).
توفر لغة Common Lisp توافقًا جزئيًا مع الإصدارات السابقة من لغة Maclisp ولغة Lisp الأصلية لجون مكارثي . وهذا يسمح بنقل برامج Lisp القديمة إلى Common Lisp. [ 6 ]
تاريخ
بدأ العمل على لغة Common Lisp عام 1981 بعد مبادرة من مدير وكالة مشاريع الأبحاث المتقدمة (ARPA)، بوب إنجلمور، لتطوير لهجة موحدة للغة Lisp. [ 7 ] وقد تم إنجاز جزء كبير من التصميم الأولي للغة عبر البريد الإلكتروني. [ 8 ] [ 9 ] وفي عام 1982، قدم جاي إل. ستيل الابن أول عرض شامل للغة Common Lisp في ندوة ACM لعام 1982 حول لغة Lisp والبرمجة الوظيفية. [ 10 ]
نُشرت أول وثائق للغة عام 1984 تحت اسم Common Lisp the Language (المعروفة اختصارًا بـ CLtL1)، في طبعتها الأولى. أما الطبعة الثانية (المعروفة اختصارًا بـ CLtL2)، التي نُشرت عام 1990، فقد تضمنت العديد من التغييرات التي أُدخلت على اللغة خلال عملية توحيد معايير ANSI Common Lisp، ومنها: توسيع صيغة LOOP، ونظام كائنات Common Lisp، ونظام الشروط لمعالجة الأخطاء، وواجهة لتنسيق النصوص، وغيرها الكثير. إلا أن CLtL2 لا تصف معيار ANSI Common Lisp النهائي، وبالتالي فهي ليست وثائقًا معتمدة للغة. وقد نُشر معيار ANSI Common Lisp النهائي عام 1994، ومنذ ذلك الحين لم تُنشر أي تحديثات له. وقد وفرت تطبيقات ومكتبات مختلفة امتدادات وتحسينات للغة Common Lisp (مثل Unicode، والتزامن، والإدخال/الإخراج القائم على CLOS ) .
بناء الجملة
لغة Common Lisp هي لهجة من لغة Lisp. تستخدم تعابير S للدلالة على كلٍ من الشيفرة البرمجية وبنية البيانات. تُكتب استدعاءات الدوال، ونماذج الماكرو، والنماذج الخاصة على شكل قوائم، مع ذكر اسم المعامل أولاً، كما في هذه الأمثلة:
( + 2 2 ) ; يجمع 2 و2، فينتج عنه 4. اسم الدالة هو '+'. لا تحتوي لغة ليسب على عوامل تشغيل بهذا المعنى.( defvar *x* ) ; يضمن وجود المتغير *x*، دون إعطائه قيمة. تُعدّ العلامات النجمية جزءًا من الاسم، وفقًا للاتفاقية، للدلالة على متغير خاص (عام). كما يُمنح الرمز *x* خاصية أن ارتباطاته اللاحقة ديناميكية وليست معجمية. ( setf *x* 42.1 ) ; يُعيّن قيمة المتغير *x* إلى القيمة العشرية 42.1عرّف دالة تربيع العدد: ( defun square ( x ) ( * xx ) )نفّذ الدالة: ( مربع 3 ) ؛ تُرجع 9يُنشئ بناء 'let' نطاقًا للمتغيرات المحلية. هنا ، يرتبط المتغير 'a' بالقيمة 6، ويرتبط المتغير 'b' بالقيمة 4. يوجد داخل 'let' ما يُسمى 'body'، حيث تُعاد آخر قيمة محسوبة. هنا، تُعاد نتيجة جمع a و b من تعبير 'let'. للمتغيرين a و b نطاق معجمي، ما لم يتم تمييز الرموز كمتغيرات خاصة (على سبيل المثال ، بواسطة DEFVAR سابق). ( let (( a 6 ) ( b 4 )) ( + ab )) تُعيد 10أنواع البيانات
تحتوي لغة Common Lisp على العديد من أنواع البيانات .
الأنواع العددية
تشمل أنواع الأعداد الأعداد الصحيحة ، والنسب ، والأعداد العشرية ، والأعداد المركبة . [ 11 ] يستخدم Common Lisp الأعداد الكبيرة (bignums) لتمثيل القيم العددية ذات الحجم والدقة غير المحدودين. يُمثل نوع النسبة الكسور بدقة، وهي ميزة غير متوفرة في العديد من اللغات. يقوم Common Lisp تلقائيًا بتحويل القيم العددية بين هذه الأنواع حسب الحاجة.
لا يقتصر نوع الأحرف في لغة Common Lisp على أحرف ASCII . تسمح معظم التطبيقات الحديثة بأحرف Unicode . [ 12 ]
يُعدّ نوع الرمز شائعًا في لغات ليسب، ولكنه غير معروف على نطاق واسع خارجها. الرمز عبارة عن كائن بيانات فريد مُسمى، يتكون من عدة أجزاء: الاسم، والقيمة، والدالة، وقائمة الخصائص، والحزمة. ومن بين هذه الأجزاء، تُعتبر خلية القيمة وخلية الدالة الأكثر أهمية. غالبًا ما تُستخدم الرموز في ليسب بشكل مشابه للمعرّفات في اللغات الأخرى: لحفظ قيمة متغير؛ ومع ذلك، هناك العديد من الاستخدامات الأخرى. عادةً، عند تقييم الرمز، تُعاد قيمته. بعض الرموز تُقيّم إلى نفسها، على سبيل المثال، جميع الرموز في الكلمة المفتاحية package تُقيّم نفسها بنفسها. تُمثل القيم المنطقية في كومون ليسب بالرمزين T وNIL اللذين يُقيّمان أنفسهما بنفسهما. يحتوي كومون ليسب على مساحات أسماء للرموز، تُسمى "حزم".
تتوفر عدة دوال لتقريب القيم العددية القياسية بطرق متنوعة. تقوم الدالة `p` roundبتقريب القيمة المُدخلة إلى أقرب عدد صحيح، مع تقريب القيم المتوسطة إلى أقرب عدد زوجي. أما الدوال truncate` floorp` و`p` و` ceilingp` فتقوم بالتقريب نحو الصفر، أو نحو الأسفل، أو نحو الأعلى على التوالي. تُعيد جميع هذه الدوال الجزء الكسري المُهمل كقيمة ثانوية. على سبيل المثال، (floor -2.5)تُنتج الدالة `p` القيمتين -3 و0.5؛ (ceiling -2.5)وتُنتج الدالة `p` القيمتين -2 و-0.5؛ وتُنتج الدالة `p` (round 2.5)القيمتين 2 و0.5؛ وتُنتج (round 3.5)الدالة `p` القيمتين 4 و-0.5.
هياكل البيانات
تشمل أنواع التسلسلات في لغة Common Lisp القوائم، والمتجهات، ومتجهات البت، والسلاسل النصية. وهناك العديد من العمليات التي يمكن تطبيقها على أي نوع من أنواع التسلسلات.
كما هو الحال في معظم لهجات لغة ليسب الأخرى، تتكون القوائم في لغة كومون ليسب من وحدات تُسمى أحيانًا خلايا أو أزواجًا من هذه الوحدات . الوحدة هي بنية بيانات تحتوي على خانتين، تُسميان car و cdr . القائمة هي سلسلة متصلة من الوحدات أو قائمة فارغة. تشير car لكل وحدة إلى عنصر من عناصر القائمة (ربما قائمة أخرى). يشير cdr لكل وحدة إلى الوحدة التالية - باستثناء الوحدة الأخيرة في القائمة، حيث يشير cdr الخاص بها إلى القيمة nil. يمكن أيضًا استخدام الوحدات بسهولة لتنفيذ الأشجار وبنى البيانات المعقدة الأخرى؛ على الرغم من أنه يُنصح عادةً باستخدام مثيلات البنية أو الفئة بدلاً من ذلك. من الممكن أيضًا إنشاء بنى بيانات دائرية باستخدام الوحدات.
تدعم لغة Common Lisp المصفوفات متعددة الأبعاد ، ويمكنها تغيير حجم المصفوفات القابلة للتعديل ديناميكيًا عند الحاجة. تُستخدم المصفوفات متعددة الأبعاد في العمليات الحسابية للمصفوفات. المتجه هو مصفوفة أحادية البعد. يمكن للمصفوفات أن تحتوي على أي نوع من العناصر (حتى أنواع مختلطة في نفس المصفوفة)، أو يمكن تخصيصها لاحتواء نوع محدد من العناصر، كما في متجه البتات. عادةً، لا يتم دعم سوى عدد قليل من الأنواع. تستطيع العديد من التطبيقات تحسين وظائف المصفوفات عند استخدام مصفوفة مُخصصة النوع. هناك نوعان قياسيان من المصفوفات المُخصصة النوع: السلسلة النصية ، وهي متجه من الأحرف، ومتجه البتات، وهو متجه من البتات .
تُخزّن جداول التجزئة العلاقات بين عناصر البيانات. يمكن استخدام أي عنصر كمفتاح أو قيمة. ويتم تغيير حجم جداول التجزئة تلقائيًا حسب الحاجة.
الحزم عبارة عن مجموعات من الرموز، تُستخدم بشكل أساسي لفصل أجزاء البرنامج إلى مساحات أسماء . قد تُصدّر الحزمة بعض الرموز، مُعلّمةً إياها كجزء من واجهة عامة. كما يمكن للحزم استخدام حزم أخرى.
تُمثل الهياكل ، المشابهة في استخدامها لهياكل لغة C وسجلات باسكال ، هياكل بيانات معقدة عشوائية بأي عدد ونوع من الحقول (تسمى خانات ). تسمح الهياكل بالوراثة الفردية.
تُشبه الأصناف البنى، لكنها توفر ميزات ديناميكية أكثر وإمكانية التوريث المتعدد. (انظر CLOS ). أُضيفت الأصناف إلى لغة Common Lisp مؤخرًا، وهناك بعض التداخل المفاهيمي بينها وبين البنى. تُسمى الكائنات المُنشأة من الأصناف بالنسخ . أما الدوال العامة فهي حالة خاصة، إذ تُعتبر دوالًا ونسخًا في آنٍ واحد.
الوظائف
تدعم لغة Common Lisp الدوال من الدرجة الأولى . على سبيل المثال، من الممكن كتابة دوال تأخذ دوالًا أخرى كوسائط أو تُرجع دوالًا أيضًا. وهذا يُتيح وصف عمليات عامة جدًا.
تعتمد مكتبة Common Lisp بشكل كبير على هذه الدوال عالية المستوى. على سبيل المثال، sortتأخذ الدالة عاملًا علائقيًا كوسيط ودالة مفتاح كوسيط اختياري. يمكن استخدام هذا ليس فقط لفرز أي نوع من البيانات، بل أيضًا لفرز هياكل البيانات وفقًا لمفتاح.
;; يرتب القائمة باستخدام الدالتين > و < كعامل مقارنة. ( sort ( list 5 2 6 3 1 4 ) #' > ) ; يُرجع (6 5 4 3 2 1) ( sort ( list 5 2 6 3 1 4 ) #' < ) ; يُرجع (1 2 3 4 5 6);; يرتب القائمة وفقًا للعنصر الأول من كل قائمة فرعية. ( sort ( list ' ( 9 A ) ' ( 3 B ) ' ( 4 C )) #' < :key #' first ) ; يُرجع ((3 B) (4 C) (9 A))نموذج تقييم الدوال بسيط للغاية. فعندما يصادف المُقيِّم صيغةً ما، (f a1 a2...)فإنه يفترض أن الرمز المسمى f هو أحد الرموز التالية:
- عامل خاص (يمكن التحقق منه بسهولة مقابل قائمة ثابتة)
- عامل ماكرو (يجب أن يكون قد تم تعريفه مسبقًا)
- اسم الدالة (افتراضيًا)، والذي قد يكون رمزًا، أو شكلًا فرعيًا يبدأ بالرمز
lambda.
إذا fكان اسم دالة، a1, a2, ..., anفسيتم تقييم الوسائط من اليسار إلى اليمين، وسيتم العثور على الدالة واستدعاؤها مع توفير تلك القيم كمعاملات.
تعريف الوظائف
يُعرّف الماكروdefun الدوال حيث يُحدد تعريف الدالة اسم الدالة، وأسماء أي وسائط، وجسم الدالة:
( defun square ( x ) ( * x x ))قد تتضمن تعريفات الدوال توجيهات للمترجم ، تُعرف باسم التصريحات ، والتي تُقدم تلميحات للمترجم حول إعدادات التحسين أو أنواع بيانات الوسائط. وقد تتضمن أيضًا سلاسل توثيق (docstrings)، والتي قد يستخدمها نظام Lisp لتوفير توثيق تفاعلي.
( defun square ( x ) "يحسب مربع العدد العشري x." ( declare ( single-float x ) ( optimize ( speed 3 ) ( debug 0 ) ( safety 1 ))) ( the single-float ( * x x )))تُعرَّف الدوال المجهولة ( الدوال الحرفيةlambda ) باستخدام تعابير، مثل دالة تربيع وسيطها. يستخدم أسلوب برمجة لغة ليسب بكثرة الدوال عالية الرتبة، والتي يكون من المفيد فيها توفير دوال مجهولة كوسائط.(lambda (x) (* x x))
يمكن تعريف الدوال المحلية باستخدام fletو labels.
( flet (( square ( x ) ( * x x ))) ( square 3 ))توجد عدة عوامل أخرى متعلقة بتعريف الدوال ومعالجتها. على سبيل المثال، يمكن ترجمة دالة باستخدام compileالعامل `.` (بعض أنظمة لغة ليسب تُشغّل الدوال باستخدام مترجم افتراضيًا ما لم يُطلب منها الترجمة؛ بينما تُترجم أنظمة أخرى كل دالة).
تحديد الوظائف والأساليب العامة
defgenericيُعرّف الماكرو الدوال العامة . الدوال العامة هي مجموعة من الطرق . يُعرّف الماكرو defmethodالطرق.
يمكن للأساليب تخصيص معاييرها على أساس فئات CLOS القياسية ، أو فئات النظام ، أو فئات البنية ، أو الكائنات الفردية. ولكل نوع من الأنواع فئات نظام مقابلة .
عند استدعاء دالة عامة، سيحدد الإرسال المتعدد الطريقة الفعالة التي يجب استخدامها.
( defgeneric add ( a b ))( defmethod add (( a number ) ( b number )) ( + a b ))( defmethod add (( a vector ) ( b number )) ( map 'vector ( lambda ( n ) ( + n b )) a ))( defmethod add (( a vector ) ( b vector )) ( map 'vector #' + a b ))( defmethod add (( a string ) ( b string )) ( concatenate 'string a b ))( أضف ٢ ٣ ) ؛ يُرجع ٥ ( أضف #( ١ ٢ ٣ ٤ ) ٧ ) ؛ يُرجع #(٨ ٩ ١٠ ١١) ( أضف #( ١ ٢ ٣ ٤ ) #( ٤ ٣ ٢ ١ )) ؛ يُرجع #(٥ ٥ ٥ ٥) ( أضف "COMMON " "LISP" ) ؛ يُرجع "COMMON LISP"تُعتبر الدوال العامة أيضًا نوعًا من أنواع البيانات الأساسية . وتتضمن الدوال والأساليب العامة العديد من الميزات الأخرى غير المذكورة أعلاه.
مساحة اسم الدالة
يتمثل أحد الاختلافات الرئيسية بين لغة Common Lisp ولغة Scheme في أن نطاق أسماء الدوال في Common Lisp منفصل عن نطاق أسماء متغيرات البيانات. في Common Lisp، تشمل المعاملات التي تُعرّف الأسماء في نطاق أسماء الدوال defun: fletو labelsو defmethodو defgeneric.
يتبع هذا النمط الذي وضعته لغة ليسب 1.5 لجون مكارثي ، والتي قامت أولاً بفصل المتغيرات والدوال إلى مساحات أسماء خاصة بها؛ بينما كانت لغة ليسب الأصلية لجون مكارثي تحتوي على مساحة اسم واحدة فقط لكليهما. [ 13 ]
لتمرير دالة من لغة Common Lisp بالاسم كوسيط لدالة أخرى، يجب استخدام functionالمعامل الخاص، والذي يُختصر عادةً إلى #'. يشير المثال الأول sortأعلاه إلى الدالة المسماة بالرمز >في مساحة اسم الدالة، والتي تحمل الكود . على العكس من ذلك، لاستدعاء دالة مُمررة بهذه الطريقة، يُستخدم المعامل على الوسيط.#'>funcall
نموذج التقييم في لغة Scheme أبسط: يوجد نطاق اسم واحد فقط، ويتم تقييم جميع المواضع في النموذج (بأي ترتيب) - وليس الوسائط فقط. لذلك، قد يكون الكود المكتوب بإحدى اللهجات مربكًا أحيانًا للمبرمجين الأكثر خبرة في اللهجة الأخرى. على سبيل المثال، يفضل العديد من مبرمجي Common Lisp استخدام أسماء متغيرات وصفية مثل list أو string، مما قد يسبب مشاكل في Scheme، لأنها ستحجب أسماء الدوال محليًا.
يُعدّ استخدام مساحة أسماء منفصلة للدوال ميزةً من مزاياها، وهو موضوع خلاف في مجتمع لغة ليسب. ويُشار إليه عادةً بنقاش ليسب-1 مقابل ليسب-2 . يشير ليسب-1 إلى نموذج لغة سكيم، بينما يشير ليسب-2 إلى نموذج لغة كومون ليسب. وقد صِيغَت هذه التسميات في ورقة بحثية نُشرت عام 1988 من قِبَل ريتشارد ب. غابرييل وكينت بيتمان ، والتي تُقارن بشكلٍ مُفصّل بين المنهجين. [ 13 ]
قيم إرجاع متعددة
تدعم لغة Common Lisp مفهوم القيم المتعددة ، [ 14 ] حيث يحتوي أي تعبير دائمًا على قيمة أساسية واحدة ، ولكنه قد يحتوي أيضًا على أي عدد من القيم الثانوية ، والتي يمكن للمستدعين المهتمين استلامها وفحصها. يختلف هذا المفهوم عن إرجاع قيمة قائمة، حيث أن القيم الثانوية اختيارية تمامًا، ويتم تمريرها عبر قناة جانبية مخصصة. هذا يعني أن المستدعين قد لا يدركون وجود القيم الثانوية إذا لم يكونوا بحاجة إليها، مما يجعل استخدام هذه الآلية مناسبًا لتوصيل المعلومات التي قد تكون مفيدة أحيانًا، ولكنها ليست ضرورية دائمًا. على سبيل المثال،
TRUNCATEتقوم الدالة [ 15 ] بتقريب العدد المُعطى إلى أقرب عدد صحيح. ومع ذلك، فإنها تُعيد أيضًا باقي القسمة كقيمة ثانوية، مما يُسهّل تحديد القيمة التي تم اقتطاعها. كما تدعم الدالة مُعاملًا اختياريًا للمُقسِم، والذي يُمكن استخدامه لإجراء القسمة الإقليدية بسهولة.
( let (( x 1266778 ) ( y 458 )) ( multiple-value-bind ( quotient remainder ) ( truncate x y ) ( format nil "~A divide by ~A is ~A remainder ~A" x y quotient remainder )));;;; => "1266778 مقسومًا على 458 يساوي 2765 والباقي 408"GETHASH[ 16 ] تُعيد قيمة مفتاح فيخريطة ترابطية، أو القيمة الافتراضية في حال عدم وجودها، بالإضافة إلى قيمة منطقية ثانوية تُشير إلى ما إذا تم العثور على القيمة. بالتالي، يمكن للبرنامج الذي لا يهتم بوجود القيمة أو توفيرها كقيمة افتراضية استخدامها كما هي، ولكن عندما يكون هذا التمييز مهمًا، فإنه قد يفحص القيمة المنطقية الثانوية ويتصرف وفقًا لذلك. يدعم الاستدعاء نفسه كلا حالتي الاستخدام، ولا تُثقل إحداهما الأخرى أو تُقيدها. وجود هذه الميزة على مستوى اللغة يُغني عن الحاجة إلى التحقق من وجود المفتاح أو مقارنته بالقيمةالفارغة (null)كما هو الحال في لغات أخرى.
( defun get-answer ( library ) ( gethash 'answer library 42 ))( defun the-answer-1 ( library ) ( format nil "الإجابة هي ~أ" ( get-answer library ))) ;;;; تُرجع "الإجابة هي 42" إذا لم تكن الإجابة موجودة في المكتبة.( defun the-answer-2 ( library ) ( multiple-value-bind ( answer sure-p ) ( get-answer library ) ( if ( not sure-p ) "لا أعرف" ( format nil "الإجابة هي ~أ" answer )))) ;;;; تُرجع "لا أعرف" إذا لم تكن الإجابة موجودة في المكتبةيتم دعم القيم المتعددة بواسطة عدد قليل من النماذج القياسية، وأكثرها شيوعًا هو MULTIPLE-VALUE-BINDالنموذج الخاص للوصول إلى القيم الثانوية VALUESولإرجاع قيم متعددة:
( defun magic-eight-ball () "إرجاع توقع للمستقبل، مع اعتبار الاحتمالية قيمة ثانوية" ( values "توقع جيد" ( random 1.0 )));;;; => "التوقعات جيدة" ;;;; => 0.3187أنواع أخرى
تشمل أنواع البيانات الأخرى في لغة Common Lisp ما يلي:
- تمثل مسارات الملفات والمجلدات في نظام الملفات . وتُعد خاصية مسارات الملفات في لغة Common Lisp أكثر عمومية من اصطلاحات تسمية الملفات في معظم أنظمة التشغيل، مما يجعل وصول برامج Lisp إلى الملفات قابلاً للنقل على نطاق واسع عبر أنظمة متنوعة.
- تمثل تدفقات الإدخال والإخراج مصادر ومستقبلات البيانات الثنائية أو النصية، مثل الطرفية أو الملفات المفتوحة.
- تحتوي لغة Common Lisp على مولد أرقام شبه عشوائي مدمج (PRNG). تمثل كائنات الحالة العشوائية مصادر قابلة لإعادة الاستخدام للأرقام شبه العشوائية، مما يسمح للمستخدم بتهيئة مولد الأرقام شبه العشوائي أو جعله يعيد تشغيل تسلسل.
- الشروط هي نوع يستخدم لتمثيل الأخطاء والاستثناءات والأحداث "المهمة" الأخرى التي قد يستجيب لها البرنامج.
- الفئات هي كائنات من الدرجة الأولى ، وهي نفسها حالات من فئات تسمى فئات الكائنات الفوقية ( فئات الفوقية باختصار).
- تُعدّ جداول القراءة نوعًا من الكائنات التي تتحكم في كيفية تحليل قارئ لغة Common Lisp لنص الشفرة المصدرية. ومن خلال التحكم في جدول القراءة المستخدم عند قراءة الشفرة، يستطيع المبرمج تغيير أو توسيع بنية اللغة.
نِطَاق
كما هو الحال في العديد من لغات البرمجة الأخرى، تستخدم برامج Common Lisp الأسماء للإشارة إلى المتغيرات والدوال وأنواع أخرى كثيرة من الكيانات. وتخضع المراجع المسماة لنطاق محدد.
يُطلق على العلاقة بين الاسم والكيان الذي يشير إليه الاسم اسم الربط.
يشير النطاق إلى مجموعة الظروف التي يتم فيها تحديد أن للاسم التزامًا معينًا.
محددات النطاق
تشمل الظروف التي تحدد نطاق اللغة في لغة Common Lisp ما يلي:
- موقع المرجع داخل التعبير. إذا كان الموقع هو أقصى اليسار في مركب، فإنه يشير إلى عامل تشغيل خاص أو ماكرو أو ربط دالة، وإلا فإنه يشير إلى ربط متغير أو شيء آخر.
- نوع التعبير الذي تتم فيه الإشارة. على سبيل المثال،
(go x)تعني نقل التحكم إلى التسميةx، بينما(print x)تشير إلى المتغيرx. يمكن أن يكون كلا نطاقيxنشطين في نفس منطقة نص البرنامج، لأن تسميات جسم الوسم تقع في مساحة اسم منفصلة عن أسماء المتغيرات. يتمتع الشكل الخاص أو شكل الماكرو بتحكم كامل في معاني جميع الرموز في صيغته. على سبيل المثال، في(defclass x (a b) ())، وهو تعريف فئة، فإن(a b)هي قائمة بالفئات الأساسية، لذلك يتم البحث عن هذه الأسماء في مساحة أسماء الفئات، وxليست إشارة إلى ربط موجود، بل اسم فئة جديدة مشتقة منaوb. تنشأ هذه الحقائق فقط من دلالاتdefclass. الحقيقة العامة الوحيدة حول هذا التعبير هي أنdefclassتشير إلى ربط ماكرو؛ كل شيء آخر متروك لـdefclass. - موقع المرجع داخل نص البرنامج. على سبيل المثال، إذا كان مرجع إلى متغير
xمُحاطًا ببنية ربط مثل `<a>`letالتي تُعرّف ربطًا لـ `<a>`x، فإن المرجع يكون ضمن النطاق الذي أنشأه ذلك الربط. - بالنسبة لمرجع متغير، يُحدد ما إذا كان رمز المتغير قد تم تعريفه كمتغير خاص، محليًا أو عالميًا. وهذا يُحدد ما إذا كان المرجع يُحل ضمن بيئة معجمية، أو ضمن بيئة ديناميكية.
- البيئة هي الحالة المحددة للبيئة التي يتم فيها حل المرجع. البيئة عبارة عن قاموس وقت التشغيل الذي يربط الرموز بالقيم. يستخدم كل نوع من المراجع بيئته الخاصة. تُحل المراجع إلى المتغيرات المعجمية في بيئة معجمية، وهكذا. يمكن ربط أكثر من بيئة واحدة بنفس المرجع. على سبيل المثال، بفضل الاستدعاء الذاتي أو استخدام خيوط متعددة، يمكن أن توجد عمليات تنشيط متعددة لنفس الدالة في الوقت نفسه. تشترك عمليات التنشيط هذه في نص البرنامج نفسه، ولكن لكل منها مثيل بيئة معجمية خاص بها.
لفهم ما يشير إليه الرمز، يجب على مبرمج Common Lisp أن يعرف نوع المرجع الذي يتم التعبير عنه، ونوع النطاق الذي يستخدمه إذا كان مرجعًا متغيرًا (نطاق ديناميكي مقابل نطاق معجمي)، وأيضًا حالة وقت التشغيل: في أي بيئة يتم حل المرجع، وأين تم إدخال الربط في البيئة، وما إلى ذلك.
أنواع البيئة
عالمي
تتميز بعض بيئات لغة ليسب بأنها شاملة على مستوى العالم. فعلى سبيل المثال، إذا تم تعريف نوع جديد، فإنه يصبح معروفًا في كل مكان بعد ذلك. وتبحث المراجع عن هذا النوع في هذه البيئة الشاملة.
متحرك
أحد أنواع البيئات في لغة Common Lisp هو البيئة الديناميكية. تتميز الروابط المُنشأة في هذه البيئة بنطاق ديناميكي، ما يعني أن الرابط يُنشأ عند بدء تنفيذ بنية معينة، مثل كتلة letبرمجية، ويختفي عند انتهاء تنفيذها: يرتبط عمره بالتنشيط والإلغاء الديناميكيين للكتلة. مع ذلك، لا يقتصر ظهور الرابط الديناميكي على تلك الكتلة فحسب، بل يظهر أيضًا لجميع الدوال المُستدعاة منها. يُعرف هذا النوع من الظهور بالنطاق غير المحدد. يُقال إن الروابط التي تُظهر نطاقًا ديناميكيًا (عمر مرتبط بتنشيط وإلغاء تنشيط الكتلة) ونطاقًا غير محدد (مرئية لجميع الدوال المُستدعاة من تلك الكتلة) تتمتع بنطاق ديناميكي.
تدعم لغة Common Lisp المتغيرات ذات النطاق الديناميكي، والتي تُسمى أيضًا بالمتغيرات الخاصة. بعض أنواع الربط الأخرى تكون بالضرورة ذات نطاق ديناميكي أيضًا، مثل إعادة التشغيل وعلامات catch. لا يمكن ربط الدوال بنطاق ديناميكي باستخدام flet(الذي يوفر فقط روابط الدوال ذات النطاق المعجمي)، ولكن يمكن إسناد كائنات الدوال (كائن من المستوى الأول في Common Lisp) إلى متغيرات ذات نطاق ديناميكي، وربطها باستخدام letفي النطاق الديناميكي، ثم استدعاؤها باستخدام funcallأو APPLY.
يُعدّ النطاق الديناميكي مفيدًا للغاية لأنه يُضفي وضوحًا مرجعيًا ودقةً على المتغيرات العامة . ويُنظر إلى المتغيرات العامة نظرة سلبية في علوم الحاسوب باعتبارها مصادر محتملة للخطأ، لأنها قد تُؤدي إلى قنوات اتصال غير رسمية وخفية بين الوحدات البرمجية، مما يُفضي إلى تفاعلات غير مرغوب فيها ومفاجئة.
في لغة Common Lisp، يتصرف المتغير الخاص الذي له ارتباط على مستوى أعلى فقط تمامًا مثل المتغير العام في لغات البرمجة الأخرى. يمكن تخزين قيمة جديدة فيه، وهذه القيمة تحل محل القيمة الموجودة في الارتباط على المستوى الأعلى. يُعدّ الاستبدال غير الدقيق لقيمة متغير عام سببًا رئيسيًا للأخطاء البرمجية الناتجة عن استخدام المتغيرات العامة. مع ذلك، ثمة طريقة أخرى للتعامل مع المتغير الخاص، وهي إعطاؤه ارتباطًا محليًا جديدًا ضمن تعبير برمجي. يُشار إلى هذه العملية أحيانًا باسم "إعادة ربط" المتغير. يؤدي ربط متغير ذي نطاق ديناميكي إلى إنشاء موقع ذاكرة جديد مؤقتًا لهذا المتغير، وربط اسمه بهذا الموقع. أثناء سريان هذا الربط، تشير جميع المراجع إلى هذا المتغير إلى الربط الجديد؛ ويبقى الربط السابق مخفيًا. عند انتهاء تنفيذ تعبير الربط، يختفي موقع الذاكرة المؤقت، ويظهر الربط القديم مع بقاء القيمة الأصلية سليمة. بالطبع، يمكن تداخل عدة روابط ديناميكية لنفس المتغير.
في تطبيقات Common Lisp التي تدعم تعدد الخيوط، تكون النطاقات الديناميكية خاصة بكل خيط تنفيذ. وبالتالي، تعمل المتغيرات الخاصة كطبقة تجريدية للتخزين المحلي للخيط. إذا أعاد أحد الخيوط ربط متغير خاص، فلن يؤثر هذا الربط على ذلك المتغير في الخيوط الأخرى. لا يمكن استرداد القيمة المخزنة في الربط إلا بواسطة الخيط الذي أنشأ ذلك الربط. إذا ربط كل خيط متغيرًا خاصًا *x*، *x*فسيتصرف المتغير كوحدة تخزين محلية للخيط. أما بين الخيوط التي لا تعيد ربط المتغير *x*، فسيتصرف كمتغير عام عادي: تشير جميع هذه الخيوط إلى نفس الربط الرئيسي للمتغير *x*.
يمكن استخدام المتغيرات الديناميكية لتوسيع سياق التنفيذ بمعلومات سياقية إضافية تُمرر ضمنيًا من دالة إلى أخرى دون الحاجة إلى ظهورها كمعامل إضافي. يُعد هذا مفيدًا بشكل خاص عندما يتطلب نقل التحكم المرور عبر طبقات من التعليمات البرمجية غير المترابطة، والتي لا يمكن توسيعها ببساطة بمعاملات إضافية لتمرير البيانات الإضافية. عادةً ما تتطلب مثل هذه الحالة متغيرًا عامًا. يجب حفظ هذا المتغير العام واستعادته، حتى لا يتعطل النظام عند التكرار: تتولى إعادة ربط المتغيرات الديناميكية هذه المهمة. ويجب جعل هذا المتغير خاصًا بكل خيط (أو استخدام قفل تبادلي كبير) حتى لا يتعطل النظام عند استخدام الخيوط: يمكن لتطبيقات النطاق الديناميكي معالجة هذه المهمة أيضًا.
تحتوي مكتبة Common Lisp على العديد من المتغيرات الخاصة القياسية. على سبيل المثال، تُخزَّن جميع تدفقات الإدخال/الإخراج القياسية في روابط المستوى الأعلى للمتغيرات الخاصة المعروفة. ويُخزَّن تدفق الإخراج القياسي في *standard-output*.
لنفترض أن الدالة foo تكتب إلى المخرج القياسي:
( defun foo () ( format t "Hello, world" ))لالتقاط مخرجاته في سلسلة نصية، يمكن ربط *standard-output* بتدفق سلسلة نصية واستدعاؤه:
( with-output-to-string ( *standard-output* ) ( foo ))-> "Hello, world" ; تم إرجاع الناتج المجمع كسلسلة نصية
معجمي
تدعم لغة Common Lisp البيئات المعجمية. من الناحية الرسمية، تتمتع الروابط في البيئة المعجمية بنطاق معجمي ، وقد يكون هذا النطاق غير محدد أو ديناميكي، وذلك بحسب نوع مساحة الاسم. يعني النطاق المعجمي أن الرؤية تقتصر فعليًا على الكتلة التي تم فيها إنشاء الرابط. المراجع غير المضمنة نصيًا (أي معجميًا) في تلك الكتلة لا ترى هذا الرابط.
تتمتع الوسوم في TAGBODY بنطاق معجمي. يكون التعبير (GO X) خاطئًا إذا لم يكن مضمنًا في TAGBODY يحتوي على الوسم X. مع ذلك، تختفي روابط الوسوم عند انتهاء تنفيذ TAGBODY، لأنها ذات نطاق ديناميكي. إذا أُعيد إدخال كتلة التعليمات البرمجية هذه عن طريق استدعاء إغلاق معجمي ، فإنه من غير الصالح أن يحاول جسم هذا الإغلاق نقل التحكم إلى وسم عبر GO.
( defvar *stashed* ) ;; سيحتوي على دالة( tagbody ( setf *stashed* ( lambda () ( go some-label ))) ( go end-label ) ;; تخطي (print "Hello") some-label ( print "Hello" ) end-label ) -> NILعند تنفيذ عنصر TAGBODY، يقوم أولاً بتقييم صيغة setf التي تخزن دالة في المتغير الخاص *stashed*. ثم ينقل الأمر (go end-label) التحكم إلى end-label، متجاوزًا الكود (print "Hello"). بما أن end-label يقع في نهاية عنصر TAGBODY، فإن عنصر TAGBODY ينتهي، مُنتجًا قيمة NIL. لنفترض الآن أنه تم استدعاء الدالة التي تم حفظها سابقًا:
( funcall *stashed* ) ;; خطأ!هذا الوضع خاطئ. إحدى طرق التنفيذ هي إظهار خطأ يتضمن الرسالة التالية: "GO: tagbody for tag SOME-LABEL has already been left". حاولت الدالة تقييم (go some-label)، المُضمنة معجميًا في tagbody، والتي تُشير إلى الوسم. مع ذلك، فإن tagbody غير مُنفذ (انتهى نطاقه)، وبالتالي لا يمكن نقل التحكم.
تتمتع روابط الدوال المحلية في لغة ليسب بنطاق معجمي ، وكذلك روابط المتغيرات افتراضيًا. وعلى عكس تسميات علم الجينات (GO)، فإن نطاق كليهما غير محدد. عند إنشاء رابط دالة أو متغير معجمي، يستمر هذا الرابط طالما أمكن الرجوع إليه، حتى بعد انتهاء البنية التي أنشأته. ويُمكن الرجوع إلى المتغيرات والدوال المعجمية بعد انتهاء البنية التي أنشأتها بفضل الإغلاقات المعجمية .
الربط المعجمي هو نمط الربط الافتراضي لمتغيرات Common Lisp. بالنسبة لرمزٍ مُحدد، يُمكن تحويله إلى نطاق ديناميكي، إما بإعلان محلي أو بإعلان عام. قد يحدث الأخير ضمنيًا باستخدام بنية مثل DEFVAR أو DEFPARAMETER. من الأعراف المهمة في برمجة Common Lisp أن المتغيرات الخاصة (أي ذات النطاق الديناميكي) لها أسماء تبدأ وتنتهي بعلامة النجمة (*)، فيما* يُعرف بـ" اتفاقية غطاء الأذن ". [ 17 ] عند الالتزام بهذه الاتفاقية، يتم إنشاء مساحة أسماء منفصلة للمتغيرات الخاصة، بحيث لا تتحول المتغيرات المُخصصة للنطاق المعجمي إلى متغيرات خاصة عن طريق الخطأ.
يُعد النطاق المعجمي مفيدًا لعدة أسباب.
أولًا، يمكن ترجمة الإشارات إلى المتغيرات والدوال إلى شفرة آلية فعّالة، نظرًا لبساطة بنية بيئة التشغيل نسبيًا. في كثير من الحالات، يمكن تحسينها لتتوافق مع تخزين المكدس، مما يقلل من الحمل الزائد لفتح وإغلاق النطاقات المعجمية. حتى في الحالات التي تتطلب إنشاء إغلاقات كاملة، يظل الوصول إلى بيئة الإغلاق فعّالًا؛ حيث يصبح كل متغير عادةً إزاحة في متجه من الروابط، وبالتالي تصبح إشارة المتغير مجرد تعليمة تحميل أو تخزين بسيطة بنمط عنونة أساسي بالإضافة إلى إزاحة .
ثانيًا، يؤدي النطاق المعجمي (بالإضافة إلى المدى غير المحدد) إلى الإغلاق المعجمي ، والذي بدوره يخلق نموذجًا كاملاً للبرمجة يتمحور حول استخدام الدوال ككائنات من الدرجة الأولى، وهو ما يمثل أساس البرمجة الوظيفية.
ثالثًا، وربما الأهم، حتى في حال عدم استغلال الإغلاقات المعجمية، فإن استخدام النطاق المعجمي يعزل وحدات البرنامج عن التفاعلات غير المرغوب فيها. نظرًا لمحدودية رؤيتها، تُعتبر المتغيرات المعجمية خاصة. فإذا ربطت وحدة (أ) متغيرًا معجميًا (س)، ثم استدعت وحدة أخرى (ب)، فلن تُشير المراجع إلى (س) في (ب) عن طريق الخطأ إلى (س) المرتبط في (أ). ببساطة، لا تملك (ب) أي وصول إلى (س). في الحالات التي يُستحسن فيها التفاعل المنظم عبر متغير، توفر لغة Common Lisp متغيرات خاصة. تسمح هذه المتغيرات الخاصة للوحدة (أ) بإنشاء ربط لمتغير (س) يكون مرئيًا للوحدة الأخرى (ب) التي يتم استدعاؤها من (أ). تُعد القدرة على القيام بذلك ميزة، كما أن القدرة على منع حدوثه تُعد ميزة أيضًا؛ وبالتالي، تدعم لغة Common Lisp كلاً من النطاق المعجمي والنطاق الديناميكي .
وحدات الماكرو
في لغة ليسب، يشبه الماكرو الدالة ظاهريًا في الاستخدام. إلا أنه بدلًا من تمثيل تعبير يتم تقييمه، فإنه يمثل تحويلًا لشفرة البرنامج المصدرية. يحصل الماكرو على الشفرة المصدرية المحيطة به كوسائط، ويربطها بمعاملاته، ثم يحسب شكلًا جديدًا للشفرة المصدرية. يمكن لهذا الشكل الجديد أيضًا استخدام ماكرو. تتكرر عملية توسيع الماكرو حتى لا يستخدم الشكل الجديد للشفرة المصدرية أي ماكرو. الشكل النهائي المحسوب هو الشفرة المصدرية التي تُنفذ أثناء التشغيل.
الاستخدامات النموذجية للماكرو في لغة ليسب:
- هياكل تحكم جديدة (مثال: هياكل التكرار، هياكل التفرع)
- تحديد النطاق وبنيات الربط
- صيغة مبسطة لشفرة المصدر المعقدة والمتكررة
- نماذج تعريفية من المستوى الأعلى ذات آثار جانبية في وقت الترجمة
- البرمجة القائمة على البيانات
- لغات خاصة بالمجال مضمنة (أمثلة: SQL ، HTML ، Prolog )
- أشكال الإنهاء الضمنية
كما يجب تنفيذ العديد من ميزات Common Lisp القياسية كوحدات ماكرو، مثل:
- التجريد القياسي
setf، للسماح بتوسيعات وقت الترجمة المخصصة لعوامل التعيين/الوصول with-accessors، ووحدات ماكروwith-slotsأخرىwith-open-fileمماثلةWITH- بحسب طريقة التنفيذ،
ifأوcondماكرو مبني على الآخر، المعامل الخاص؛whenويتكونunlessمن وحدات ماكرو - لغة قوية
loopخاصة بالمجال
تُعرَّف وحدات الماكرو بواسطة الماكرو defmacro . يسمح المعامل الخاص macrolet بتعريف وحدات ماكرو محلية (ذات نطاق معجمي). كما يُمكن تعريف وحدات ماكرو للرموز باستخدام define-symbol-macro و symbol-macrolet .
يشرح كتاب بول غراهام " On Lisp" استخدام وحدات الماكرو في لغة Common Lisp بالتفصيل. ويتوسع كتاب دوغ هويت " Let Over Lambda" في مناقشة وحدات الماكرو، مؤكدًا أن "وحدات الماكرو هي الميزة الأهم للغة Lisp كلغة برمجة، بل هي الميزة الأهم لأي لغة برمجة". ويقدم هويت عدة أمثلة على التطوير التكراري لوحدات الماكرو.
مثال على استخدام ماكرو لتعريف بنية تحكم جديدة
تتيح وحدات الماكرو لمبرمجي لغة ليسب إنشاء أشكال نحوية جديدة في اللغة. ومن الاستخدامات الشائعة لها إنشاء هياكل تحكم جديدة. يوفر الماكرو المثال untilبنية تكرارية. صيغته هي:
(حتى نموذج الاختبار*) التعريف الكلي للدالة حتى :
( defmacro until ( test &body body ) ( let (( start-tag ( gensym "START" )) ( end-tag ( gensym "END" ))) ` ( tagbody , start-tag ( when , test ( go , end-tag )) ( progn , @body ) ( go , start -tag ) , end-tag )))يُعدّ tagbody مُعاملًا خاصًا بدائيًا في لغة Common Lisp، يُتيح تسمية الوسوم واستخدام صيغة go للانتقال إليها. تُوفّر علامة الاقتباس الخلفية ` صيغةً تُقدّم قوالب برمجية، حيث تُملأ قيم الصيغ التي تسبقها فاصلة. أما الصيغ التي تسبقها فاصلة وعلامة @، فتُدمج . تختبر صيغة tagbody شرط النهاية. إذا كان الشرط صحيحًا، ينتقل البرنامج إلى وسم النهاية. وإلا، يُنفّذ كود body المُقدّم، ثم ينتقل إلى وسم البداية.
مثال على استخدام ماكرو until المذكور أعلاه :
( حتى ( = ( عشوائي 10 ) 0 ) ( اكتب السطر "مرحباً" ))يمكن توسيع الكود باستخدام الدالة macroexpand-1 . يبدو التوسيع للمثال أعلاه كما يلي:
( TAGBODY #:START1136 ( WHEN ( ZEROP ( RANDOM 10 )) ( GO #:END1137 )) ( PROGN ( WRITE-LINE "hello" )) ( GO #:START1136 ) #:END1137 )أثناء توسيع الماكرو، تكون قيمة المتغير test هي (= (random 10) 0) وقيمة المتغير body هي ((write-line "Hello")) . يمثل body قائمة من النماذج.
تُحوّل الرموز عادةً إلى أحرف كبيرة تلقائيًا. يستخدم التوسيع عنصر TAGBODY مع مُلصقين. تُحسب رموز هذين المُلصقين بواسطة GENSYM ولا تُخزّن في أي حزمة. يستخدم نموذجان من Go هذه العلامات للانتقال. بما أن tagbody مُعامل أساسي في Common Lisp (وليس ماكرو)، فلن يتم توسيعه إلى شيء آخر. يستخدم النموذج المُوسّع الماكرو when ، والذي سيتم توسيعه أيضًا. يُطلق على التوسيع الكامل لنموذج المصدر اسم " التنقل بين التعليمات البرمجية" .
في الصيغة الموسعة بالكامل ( المُسيرة )، يتم استبدال صيغة " عندما" بالصيغة الأولية " إذا" :
( TAGBODY #:START1136 ( IF ( ZEROP ( RANDOM 10 )) ( PROGN ( GO #:END1137 )) NIL ) ( PROGN ( WRITE-LINE "hello" )) ( GO #:START1136 )) #:END1137 )يجب توسيع جميع وحدات الماكرو قبل تقييم أو تجميع الكود المصدري الذي يحتويها بشكل طبيعي. يمكن اعتبار وحدات الماكرو دوالًا تقبل وتعيد تعابير S ، على غرار أشجار بناء الجملة المجردة ، ولكنها لا تقتصر عليها. تُستدعى هذه الدوال قبل المُقيِّم أو المُجمِّع لإنتاج الكود المصدري النهائي. تُكتب وحدات الماكرو بلغة Common Lisp العادية، ويمكنها استخدام أي مُعامل متاح في Common Lisp (أو مُعامل من طرف ثالث).
التقاط متغير والتظليل
تتميز وحدات الماكرو في لغة Common Lisp بقدرتها على ما يُعرف باسم " التقاط المتغيرات" ، حيث تتطابق الرموز الموجودة في جسم توسيع الماكرو مع تلك الموجودة في سياق الاستدعاء، مما يسمح للمبرمج بإنشاء وحدات ماكرو تحمل فيها رموز مختلفة معاني خاصة. يُعدّ مصطلح " التقاط المتغيرات" مُضللاً بعض الشيء، لأن جميع مساحات الأسماء عُرضة للالتقاط غير المرغوب فيه، بما في ذلك مساحة اسم المعامل والدالة، ومساحة اسم تسمية جسم الوسم، ووسم الالتقاط، ومعالج الشرط، ومساحات أسماء إعادة التشغيل.
قد يؤدي استخدام المتغيرات إلى ظهور عيوب برمجية. ويحدث هذا بإحدى الطريقتين التاليتين:
- في الحالة الأولى، قد يؤدي توسيع الماكرو عن غير قصد إلى إنشاء مرجع رمزي افترض كاتب الماكرو أنه سيُحل في نطاق اسم عام، ولكن الكود الذي يُوسّع فيه الماكرو يُوفّر تعريفًا محليًا مُظللًا يستحوذ على ذلك المرجع. لنُسمّي هذا النوع من الالتقاط "النوع 1".
- أما الطريقة الثانية، وهي نوع الالتقاط الثاني، فهي عكس ذلك تمامًا: بعض وسائط الماكرو عبارة عن أجزاء من التعليمات البرمجية التي يوفرها مستدعي الماكرو، وهذه الأجزاء مكتوبة بحيث تشير إلى روابط محيطة. مع ذلك، يُدرج الماكرو هذه الأجزاء من التعليمات البرمجية في توسيع يُعرّف روابطه الخاصة، مما يؤدي عن غير قصد إلى التقاط بعض هذه المراجع.
توفر لهجة Scheme في لغة Lisp نظام كتابة ماكرو يوفر شفافية مرجعية تقضي على كلا نوعي مشكلة الالتقاط. يُطلق على هذا النوع من أنظمة الماكرو أحيانًا اسم "النظام الصحي"، لا سيما من قبل مؤيديه (الذين يعتبرون أنظمة الماكرو التي لا تحل هذه المشكلة تلقائيًا غير صحية).
في لغة Common Lisp، يتم ضمان نظافة الماكرو بإحدى طريقتين مختلفتين.
أحد الأساليب هو استخدام الرموز العامة (gensyms ): وهي رموز فريدة مضمونة يمكن استخدامها في توسيع الماكرو دون خطر الالتقاط. يُعدّ استخدام الرموز العامة في تعريف الماكرو عملية يدوية، ولكن يمكن كتابة ماكروات تُبسّط إنشاء الرموز العامة واستخدامها. تحلّ الرموز العامة مشكلة الالتقاط من النوع الثاني بسهولة، ولكنها لا تُطبّق على مشكلة الالتقاط من النوع الأول بنفس الطريقة، لأن توسيع الماكرو لا يمكنه إعادة تسمية الرموز المتداخلة في الكود المحيط التي تلتقط مراجعها. يمكن استخدام الرموز العامة لتوفير أسماء بديلة ثابتة للرموز العامة التي يحتاجها توسيع الماكرو. سيستخدم توسيع الماكرو هذه الأسماء البديلة السرية بدلاً من الأسماء المعروفة، لذا فإن إعادة تعريف الأسماء المعروفة لن يكون لها أي تأثير سلبي على الماكرو.
ثمة نهج آخر يتمثل في استخدام الحزم. إذ يمكن للماكرو المُعرَّف في حزمة خاصة به أن يستخدم ببساطة الرموز الداخلية لتلك الحزمة عند توسيعه. ويتعامل استخدام الحزم مع نوعي الالتقاط 1 و2.
مع ذلك، لا تُعالج الحزم مشكلة التقاط المراجع من النوع الأول لوظائف ومعاملات لغة Common Lisp القياسية. والسبب هو أن استخدام الحزم لحل مشاكل الالتقاط يعتمد على استخدام الرموز الخاصة (الرموز الموجودة في حزمة واحدة، والتي لا يتم استيرادها أو إظهارها في حزم أخرى). بينما رموز مكتبة Common Lisp خارجية، ويتم استيرادها أو إظهارها بشكل متكرر في حزم يُعرّفها المستخدم.
فيما يلي مثال على عملية التقاط غير مرغوب فيها في مساحة اسم المشغل، والتي تحدث عند توسيع الماكرو:
;; توسيع UNTIL يستخدم DO بشكل كبير ( defmacro until ( expression &body body ) ` ( do () ( , expression ) ,@ body ));; تُنشئ وحدة macrolet ربطًا معجميًا للمعامل DO ( macrolet (( do ( ... ) ... شيء آخر ... )) ( until ( = ( random 10 ) 0 ) ( write-line "Hello" )))untilسيتوسع الماكرو إلى شكل يستدعي دالة يُقصد doبها الإشارة إلى ماكرو Common Lisp القياسي do. مع ذلك، في هذا السياق، doقد يكون لها معنى مختلف تمامًا، لذا untilقد لا تعمل بشكل صحيح.
تحلّ لغة Common Lisp مشكلة تداخل المعاملات والوظائف القياسية بمنع إعادة تعريفها. ولأنها تعيد تعريف المعامل القياسي do، فإن ما سبق هو في الواقع جزء من لغة Common Lisp غير المتوافقة، مما يسمح للتطبيقات بتشخيصها ورفضها.
نظام التكييف
يتولى نظام الشروط مسؤولية معالجة الاستثناءات في لغة Common Lisp. [ 18 ] فهو يوفر الشروط ، والمعالجات ، وعمليات إعادة التشغيل . الشروط عبارة عن كائنات تصف حالة استثنائية (مثل خطأ). عند ورود إشارة لشرط ما ، يبحث نظام Common Lisp عن معالج لهذا النوع من الشروط ويستدعيه. يمكن للمعالج بعد ذلك البحث عن عمليات إعادة التشغيل واستخدام إحداها لإصلاح المشكلة الحالية تلقائيًا، وذلك بالاستعانة بمعلومات مثل نوع الشرط وأي معلومات ذات صلة مُقدمة كجزء من كائن الشرط، ثم يستدعي دالة إعادة التشغيل المناسبة.
يمكن عرض عمليات إعادة التشغيل هذه، في حال عدم معالجتها برمجياً، للمستخدمين (كجزء من واجهة المستخدم، كواجهة مصحح الأخطاء مثلاً)، ليتمكن المستخدم من اختيار إحدى عمليات إعادة التشغيل المتاحة واستدعائها. وبما أن معالج الحالة يُستدعى في سياق الخطأ (دون فكّ مكدس الاستدعاءات)، فإن استعادة الخطأ بالكامل ممكنة في كثير من الحالات، حيث تكون أنظمة معالجة الاستثناءات الأخرى قد أنهت الروتين الحالي بالفعل. كما يمكن تخصيص مصحح الأخطاء نفسه أو استبداله باستخدام *debugger-hook*المتغير الديناميكي. وسيتم أيضاً تنفيذ التعليمات البرمجية الموجودة داخل نماذج الحماية من فكّ المكدس، مثل دوال الإنهاء، حسب الاقتضاء، على الرغم من وجود الاستثناء.
في المثال التالي (باستخدام Symbolics Genera )، يحاول المستخدم فتح ملف في دالة اختبار مكتوبة بلغة Lisp، يتم استدعاؤها من حلقة القراءة والتقييم والطباعة ( REPL )، بينما الملف غير موجود. يعرض نظام Lisp أربع عمليات إعادة تشغيل. يختار المستخدم إعادة التشغيل "إعادة المحاولة باستخدام مسار مختلف" ويدخل مسارًا مختلفًا (lispm-init.lisp بدلًا من lispm-int.lisp). لا يحتوي كود المستخدم على أي تعليمات برمجية لمعالجة الأخطاء. يوفر نظام Lisp كامل تعليمات معالجة الأخطاء وإعادة التشغيل، حيث يمكنه معالجة الخطأ وإصلاحه دون إنهاء كود المستخدم.
الأمر: (اختبار ">zippy>lispm-int.lisp") خطأ: لم يتم العثور على الملف. لـ lispm:>zippy>lispm-int.lisp.newest LMFS:OPEN-LOCAL-LMFS-1 الوسيط 0: #P"lispm:>zippy>lispm-int.lisp.newest" sA، <استئناف>: إعادة محاولة فتح lispm:>zippy>lispm-int.lisp.newest sB: أعد محاولة الفتح باستخدام مسار مختلف sC, <Abort>: العودة إلى المستوى الأعلى من لغة Lisp في خادم TELNET sD: إعادة تشغيل عملية طرفية TELNET -> أعد محاولة الفتح باستخدام مسار مختلف استخدم مسار الملف بدلاً من ذلك [default lispm:>zippy>lispm-int.lisp.newest]: lispm:>zippy>lispm-init.lisp.newest ...يستمر البرنامج نظام كائنات لغة ليسب الشائعة (CLOS)
تتضمن لغة Common Lisp مجموعة أدوات للبرمجة كائنية التوجه ، تُعرف بنظام كائنات Common Lisp ( CLOS) . يشرح بيتر نورفيج كيف أن العديد من أنماط التصميم أسهل في التنفيذ بلغة ديناميكية بفضل ميزات CLOS (الوراثة المتعددة، والمزيجات، والأساليب المتعددة، والفئات الوصفية، ومجموعات الأساليب، إلخ). [ 19 ] وقد اقتُرحت عدة امتدادات للغة Common Lisp للبرمجة كائنية التوجه لإدراجها في معيار ANSI Common Lisp، ولكن في النهاية تم اعتماد CLOS كنظام الكائنات القياسي للغة Common Lisp. يُعد CLOS نظام كائنات ديناميكيًا يدعم الإرسال المتعدد والوراثة المتعددة ، ويختلف اختلافًا جذريًا عن إمكانيات البرمجة كائنية التوجه الموجودة في اللغات الثابتة مثل C++ أو Java . وباعتباره نظام كائنات ديناميكيًا، يسمح CLOS بإجراء تغييرات على الدوال والفئات العامة أثناء التشغيل. يمكن إضافة الأساليب وإزالتها، ويمكن إضافة الفئات وإعادة تعريفها، ويمكن تحديث الكائنات لتغييرات الفئات، كما يمكن تغيير فئة الكائنات.
تم دمج CLOS في لغة ANSI Common Lisp. يمكن استخدام الدوال العامة كدوال عادية، وهي تُعتبر نوع بيانات من الدرجة الأولى. كل فئة من فئات CLOS مُدمجة في نظام أنواع Common Lisp. العديد من أنواع Common Lisp لها فئة مُقابلة. هناك استخدامات أخرى مُحتملة لـ CLOS في Common Lisp. لا تُحدد المواصفات ما إذا كانت الشروط مُطبقة باستخدام CLOS. يُمكن تطبيق مسارات البيانات والتدفقات باستخدام CLOS. هذه الاستخدامات الإضافية لـ CLOS في ANSI Common Lisp ليست جزءًا من المعيار. تستخدم تطبيقات Common Lisp الفعلية CLOS لمسارات البيانات، والتدفقات، والمدخلات والمخرجات، والشروط، وتطبيق CLOS نفسه، وغير ذلك.
مترجم ومفسر
يقوم مترجم لغة ليسب بتنفيذ شيفرة ليسب المصدرية مباشرةً، والتي تُقدَّم على شكل كائنات ليسب (قوائم، رموز، أرقام، إلخ) تُقرأ من تعابير S. بينما يقوم مُجمِّع ليسب بإنشاء شيفرة بايت أو شيفرة آلية من شيفرة ليسب المصدرية. تتيح لغة Common Lisp إمكانية تجميع دوال ليسب الفردية في الذاكرة، بالإضافة إلى تجميع الملفات الكاملة إلى شيفرة مُجمَّعة مخزنة خارجيًا ( ملفات fasl ).
وفرت العديد من تطبيقات لهجات لغة ليسب السابقة كلاً من المفسر والمترجم. مع ذلك، غالبًا ما كانت دلالات كل منهما مختلفة. طبقت هذه اللهجات السابقة نطاقًا معجميًا في المترجم ونطاقًا ديناميكيًا في المفسر. تتطلب لغة ليسب الشائعة استخدام النطاق المعجمي افتراضيًا في كل من المفسر والمترجم. يصف معيار ليسب الشائعة دلالات كل من المفسر والمترجم. يمكن استدعاء المترجم باستخدام الدالة compile للدوال الفردية، وباستخدام الدالة compile-file للملفات. تسمح ليسب الشائعة بتعريفات الأنواع، وتوفر طرقًا للتأثير على سياسة توليد كود المترجم. بالنسبة لهذه الأخيرة، يمكن إعطاء قيم لخصائص التحسين المختلفة تتراوح بين 0 (غير مهم) و3 (الأكثر أهمية): السرعة ، والمساحة ، والأمان ، والتصحيح ، وسرعة الترجمة .
توجد أيضًا دالة لتقييم كود Lisp: evalتأخذ evalالكود كتعابير S مُحللة مسبقًا، وليس كسلاسل نصية كما هو الحال في بعض اللغات الأخرى. بهذه الطريقة، يمكن إنشاء الكود باستخدام دوال Lisp المعتادة لإنشاء القوائم والرموز، ثم تقييم هذا الكود باستخدام الدالة eval. تُنفذ العديد من تطبيقات Common Lisp (مثل Clozure CL وSBCL) هذه الدالة evalباستخدام مُترجمها. بهذه الطريقة، يتم تجميع الكود، حتى وإن تم تقييمه باستخدام الدالة eval.
يتم استدعاء مُجمِّع الملفات باستخدام الدالة compile-file . يُسمى الملف الناتج الذي يحتوي على الكود المُجمَّع ملف fasl (اختصارًا لـ fast load ). يمكن تحميل ملفات fasl هذه ، بالإضافة إلى ملفات الكود المصدري، باستخدام الدالة load في نظام Common Lisp قيد التشغيل. اعتمادًا على التنفيذ، يُولِّد مُجمِّع الملفات رمزًا وسيطًا (على سبيل المثال، لآلة جافا الافتراضية )، أو كودًا بلغة C (يُجمَّع بعد ذلك باستخدام مُجمِّع C)، أو مباشرةً كودًا أصليًا.
يمكن استخدام تطبيقات لغة Common Lisp بشكل تفاعلي، على الرغم من أن الكود يُترجم بالكامل. وبالتالي، فإن مفهوم اللغة المفسرة لا ينطبق على لغة Common Lisp التفاعلية.
تُفرّق اللغة بين وقت القراءة، ووقت الترجمة، ووقت التحميل، ووقت التشغيل، وتسمح لرمز المستخدم أيضًا بإجراء هذا التمييز لتنفيذ نوع المعالجة المطلوب في الخطوة المطلوبة.
تُوفّر بعض المعاملات الخاصة لتناسب التطوير التفاعلي على وجه الخصوص؛ فعلى سبيل المثال، defvarلن يُسند معاملٌ قيمةً إلى المتغير المُقدّم إلا إذا لم يكن مُرتبطًا به مُسبقًا، بينما defparameterسيُسند معاملٌ آخر القيمة دائمًا. يُعدّ هذا التمييز مفيدًا عند تقييم وتجميع وتحميل التعليمات البرمجية بشكل تفاعلي في بيئة تشغيل مباشرة.
تُوفّر بعض الميزات أيضًا للمساعدة في كتابة المترجمات والمفسرات. تتكون الرموز من كائنات من المستوى الأول، ويمكن للمستخدم التعامل معها مباشرةً. progvيسمح المعامل الخاص بإنشاء روابط معجمية برمجيًا، كما يمكن التعامل مع الحزم أيضًا. يتوفر مترجم لغة ليسب أثناء التشغيل لتجميع الملفات أو الدوال الفردية. هذا يُسهّل استخدام ليسب كمترجم أو مفسر وسيط للغات أخرى.
أمثلة على التعليمات البرمجية
مفارقة عيد الميلاد
يحسب البرنامج التالي أقل عدد من الأشخاص في غرفة ما ممن تقل احتمالية اختلاف أعياد ميلادهم عن 50% ( مفارقة عيد الميلاد ، حيث تكون الاحتمالية لشخص واحد 100%، ولشخصين 364/365، وهكذا). والجواب هو 23.
في لغة Common Lisp، وبحسب الاصطلاح، يتم وضع الثوابت بين علامتي +.
( defconstant +year-size+ 365 )( defun birthday-paradox ( probability number-of-people ) ( let (( new-probability ( * ( / ( - +year-size+ number-of-people ) +year-size+ ) probability ))) ( if ( < new-probability 0.5 ) ( 1+ number-of-people ) ( birthday-paradox new-probability ( 1+ number-of-people )))))استدعاء الدالة النموذجية باستخدام REPL (حلقة القراءة والتقييم والطباعة):
CL-USER > (birthday-paradox 1.0 1) 23 فرز قائمة من كائنات الأشخاص
نُعرّف فئةً personودالةً لعرض اسم الشخص وعمره. ثم نُعرّف مجموعةً من الأشخاص كقائمةٍ من personالكائنات. بعد ذلك، نُجري عملية تكرارٍ على القائمة المُرتّبة.
( defclass person () (( name :initarg :name :accessor person-name ) ( age :initarg :age :accessor person-age )) ( :documentation "The class PERSON with slots NAME and AGE." ))( defmethod display (( object person ) stream ) "عرض كائن PERSON في دفق إخراج." ( with-slots ( name age ) object ( format stream "~a (~a)" name age )))( defparameter *group* ( list ( make-instance 'person :name "Bob" :age 33 ) ( make-instance 'person :name "Chris" :age 16 ) ( make-instance 'person :name "Ash" :age 23 )) "قائمة من كائنات PERSON." )( dolist ( person ( sort ( copy-list *group* ) #' > :key #' person-age )) ( display person *standard-output* ) ( terpri ))يطبع البرنامج الأسماء الثلاثة مرتبة حسب العمر تنازلياً.
بوب (33) آش (23) كريس (16) رفع العدد إلى الأس عن طريق التربيع
يتم توضيح استخدام ماكرو LOOP:
( defun power ( x n ) ( loop with result = 1 while ( plusp n ) when ( oddp n ) do ( setf result ( * result x )) do ( setf x ( * x x ) n ( truncate n 2 )) finally ( return result )))مثال على الاستخدام:
CL-USER > ( power 2 200 ) 1606938044258990275541962092341162602522202993782792835301376قارن ذلك مع عملية الأسس المدمجة:
CL-USER > ( = ( expt 2 200 ) ( power 2 200 )) Tابحث عن قائمة الأصداف المتاحة
يُعدّ WITH-OPEN-FILE ماكرو يفتح ملفًا ويُوفّر دفقًا. عند انتهاء تنفيذ النموذج، يُغلق الملف تلقائيًا. يستدعي FUNCALL كائن دالة. يجمع LOOP جميع الأسطر التي تُطابق الشرط.
( defun list-matching-lines ( file predicate ) "إرجاع قائمة بالأسطر في الملف، والتي يُرجع الشرط المطبق على السطر القيمة T." ( with-open-file ( stream file ) ( loop for line = ( read-line stream nil nil ) while line when ( funcall predicate line ) collect it )))تستدعي الدالة AVAILABLE-SHELLS الدالة LIST-MATCHING-LINES المذكورة أعلاه، مع تحديد مسار الملف ودالة مجهولة كمعامل. يُعيد المعامل مسار ملف shell أو قيمة فارغة (NIL) إذا لم يكن النص المُدخل اسم ملف shell.
( defun available-shells ( &optional ( file #p"/etc/shells" )) ( list-matching-lines file ( lambda ( line ) ( and ( plusp ( length line )) ( char= ( char line 0 ) #\/ ) ( pathname ( string-right-trim ' ( #\space #\tab ) line ))))))مثال على النتائج (على نظام التشغيل Mac OS X 10.6):
CL-USER > ( available-shells ) ( #P"/bin/bash" #P"/bin/csh" #P"/bin/ksh" #P"/bin/sh" #P"/bin/tcsh" #P"/bin/zsh" )مقارنة مع لغات Lisp الأخرى
تُقارن لغة Common Lisp في أغلب الأحيان بلغة Scheme ، وتُقابل بها أيضاً، وذلك لكونهما أكثر لهجات Lisp شيوعاً. وتسبق Scheme لغة Common Lisp، وهي لا تنتمي فقط إلى نفس تقاليد Lisp، بل أيضاً إلى بعض المهندسين أنفسهم، مثل جاي ستيل ، الذي شارك جيرالد جاي سوسمان في تصميم Scheme، والذي ترأس لجنة المعايير الخاصة بلغة Common Lisp.
لغة Common Lisp هي لغة برمجة عامة الأغراض، على عكس لغات Lisp الأخرى مثل Emacs Lisp و AutoLISP ، وهي لغات إضافية مُدمجة في منتجات محددة (GNU Emacs وAutoCAD على التوالي). وعلى عكس العديد من لغات Lisp السابقة، تستخدم Common Lisp (مثل Scheme ) نطاق المتغيرات المعجمي افتراضيًا لكل من التعليمات البرمجية المُفسَّرة والمُجمَّعة.
معظم أنظمة لغة ليسب التي ساهمت تصاميمها في تطوير لغة كومون ليسب - مثل زيتا ليسب وفرانز ليسب - استخدمت متغيرات ذات نطاق ديناميكي في مترجماتها، ومتغيرات ذات نطاق معجمي في مُجمّعاتها. أدخلت لغة سكيم استخدام المتغيرات ذات النطاق المعجمي فقط إلى لغة ليسب، مستلهمةً ذلك من لغة ALGOL 68. تدعم لغة كومون ليسب أيضًا المتغيرات ذات النطاق الديناميكي، ولكن يجب تعريفها صراحةً على أنها "خاصة". لا توجد اختلافات في نطاق المتغيرات بين مترجمات ومُجمّعات لغة كومون ليسب المتوافقة مع معيار ANSI.
يُطلق على لغة Common Lisp أحيانًا اسم Lisp-2، وعلى لغة Scheme اسم Lisp-1 ، وذلك نظرًا لاستخدام Common Lisp مساحات أسماء منفصلة للدوال والمتغيرات. (في الواقع، تحتوي Common Lisp على العديد من مساحات الأسماء، مثل تلك الخاصة بعلامات go، وأسماء الكتل، والكلمات loopالمفتاحية). وهناك جدل قائم منذ فترة طويلة بين مؤيدي Common Lisp وScheme حول المفاضلات التي ينطوي عليها استخدام مساحات أسماء متعددة. في Scheme، من الضروري (بشكل عام) تجنب إعطاء المتغيرات أسماءً تتعارض مع أسماء الدوال؛ فكثيرًا ما تحتوي دوال Scheme على وسائط تحمل أسماءً مثل `____` lisأو lst`____` أو `____` lystلتجنب التعارض مع دالة النظام ` list____`. مع ذلك، في Common Lisp، من الضروري الإشارة صراحةً إلى مساحة اسم الدالة عند تمرير دالة كوسيط، وهو أمر شائع أيضًا، كما في sortالمثال أعلاه.
تختلف لغة CL عن لغة Scheme في طريقة تعاملها مع القيم المنطقية. تستخدم Scheme القيمتين الخاصتين #t و#f لتمثيل الصواب والخطأ على التوالي. بينما تتبع CL اصطلاح Lisp القديم باستخدام الرمزين T وNIL، حيث يرمز NIL أيضًا إلى القائمة الفارغة. في CL، تُعامل أيif قيمة غير NIL على أنها صحيحة في العبارات الشرطية، مثل `true`، بينما في Scheme تُعامل جميع القيم غير #f على أنها صحيحة. تسمح هذه الاصطلاحات لبعض المعاملات في كلتا اللغتين بالعمل كمسندات (للإجابة على سؤال منطقي) وكقيمة مُرجعة مفيدة لإجراء المزيد من العمليات الحسابية، ولكن في Scheme، تُقيّم القيمة `()`، المكافئة لـ NIL في Common Lisp، إلى صحيح في التعبير المنطقي.
أخيرًا، تتطلب وثائق معايير Scheme تحسين استدعاءات الذيل ، وهو ما لا يتطلبه معيار CL. توفر معظم تطبيقات CL تحسين استدعاءات الذيل، ولكن غالبًا فقط عند استخدام المبرمج لتوجيه التحسين. مع ذلك، لا يُفضل أسلوب برمجة CL الشائع استخدام الاستدعاء الذاتي المُنتشر الذي يُفضله أسلوب Scheme - فما يُعبر عنه مبرمج Scheme بالاستدعاء الذاتي الذيل، يُعبر عنه مستخدم CL عادةً بتعبير تكراري في `<sup>1</sup>` أو `<sup>2</sup>` doأو dolist( loopمؤخرًا) باستخدام iterateالحزمة `<sup>3</sup>`.
التطبيقات
انظر إلى فئة تطبيقات Common Lisp .
تُعرَّف لغة Common Lisp بمواصفات محددة (مثل لغتي Ada و C ) بدلاً من تطبيق واحد (مثل لغة Perl ). توجد العديد من التطبيقات، ويحدد المعيار المجالات التي قد تختلف فيها هذه التطبيقات بشكل صحيح.
بالإضافة إلى ذلك، تميل التطبيقات إلى أن تأتي مع ملحقات توفر وظائف غير مشمولة في المعيار:
- واجهة تفاعلية من المستوى الأعلى (REPL)
- جمع القمامة
- مصحح الأخطاء، ومُنفذ الخطوات، والمُفتش
- هياكل البيانات الضعيفة (جداول التجزئة)
- التسلسلات القابلة للتمديد
- حلقة قابلة للتوسيع
- الوصول إلى البيئة
- بروتوكول الكائنات الوصفية CLOS
- تدفقات قابلة للتوسيع تعتمد على CLOS
- نظام الشروط القائم على نظام CLOS
- تدفقات الشبكة
- إغلاق مستمر
- دعم يونيكود
- واجهة لغة أجنبية (غالباً إلى لغة C)
- واجهة نظام التشغيل
- واجهة جافا
- الخيوط والمعالجة المتعددة
- توصيل التطبيقات (التطبيقات، المكتبات الديناميكية)
- حفظ الصور
تم إنشاء مكتبات برمجية مجانية ومفتوحة المصدر لدعم الإضافات إلى Common Lisp بطريقة محمولة، وتوجد بشكل ملحوظ في مستودعات مشاريع Common-Lisp.net [ 20 ] و CLOCC (مجموعة التعليمات البرمجية المفتوحة لـ Common Lisp) [ 21 ] .
قد تستخدم تطبيقات Common Lisp أي مزيج من ترجمة الشفرة الأصلية، أو ترجمة الشفرة الثنائية، أو تفسيرها. صُممت Common Lisp لدعم المترجمات التزايدية ، ومترجمات الملفات، ومترجمات الكتل. تُقترح في مواصفات اللغة تعريفات قياسية لتحسين الترجمة (مثل تضمين الدوال أو تخصيص الأنواع). تُترجم معظم تطبيقات Common Lisp الشفرة المصدرية إلى شفرة الآلة الأصلية . يمكن لبعض التطبيقات إنشاء تطبيقات مستقلة (مُحسّنة). بينما تُترجم تطبيقات أخرى إلى شفرة ثنائية مُفسّرة ، وهي أقل كفاءة من الشفرة الأصلية، ولكنها تُسهّل نقل الشفرة الثنائية. تُترجم بعض المترجمات شفرة Common Lisp إلى شفرة C. يرجع سوء الفهم بأن Lisp لغة مُفسّرة بالكامل على الأرجح إلى أن بيئات Lisp تُوفر موجهًا تفاعليًا، وأن الشفرة تُترجم سطرًا سطرًا، بطريقة تزايدية. مع Common Lisp، تُستخدم الترجمة التزايدية على نطاق واسع.
يمكن استخدام بعض التطبيقات القائمة على نظام يونكس ( CLISP ، SBCL ) كلغة برمجة نصية ؛ أي يتم استدعاؤها بواسطة النظام بشكل شفاف بالطريقة التي يتم بها استدعاء مترجم أوامر بيرل أو يونكس . [ 22 ]
قائمة التطبيقات
التطبيقات التجارية
- أليجرو كومون ليسب
- يدعم برنامج Allegro CL أنظمة التشغيل Microsoft Windows و FreeBSD و Linux و Apple macOS ومختلف إصدارات أنظمة UNIX. يوفر بيئة تطوير متكاملة (IDE) (لأنظمة Windows و Linux) وإمكانيات واسعة لتطوير التطبيقات.
- لغة ليسب السائلة المشتركة
- كانت تُعرف سابقًا باسم Lucid Common Lisp. تقتصر على الصيانة فقط، ولا توجد إصدارات جديدة.
- LispWorks
- يدعم LispWorks أنظمة التشغيل Microsoft Windows و FreeBSD و Linux و Apple macOS و iOS و Android والعديد من إصدارات UNIX. يوفر بيئة تطوير متكاملة (IDE) (متوفرة لمعظم المنصات، باستثناء iOS و Android) وإمكانيات واسعة لتطوير التطبيقات.
- موكل
- لأنظمة iOS و Android و macOS.
- أوبن جينيرا
- لـ DEC Alpha.
- لغة ليسب العلمية
- مصمم للحوسبة العلمية عالية الأداء.
تطبيقات قابلة لإعادة التوزيع مجاناً
- التلعثم الشائع للدب المسلح (ABCL)
- تطبيق CL يعمل على آلة جافا الافتراضية . [ 23 ] يتضمن مُترجمًا إلى بايت كود جافا ، ويتيح الوصول إلى مكتبات جافا من CL. كان سابقًا مجرد مكون من مُحرر Armed Bear J.
- مشبك
- تطبيق قائم على LLVM يتكامل بسلاسة مع مكتبات C++. يعمل على العديد من أنظمة Unix والأنظمة الشبيهة بـ Unix (بما في ذلك macOS ).
- كليسب
- تطبيق لتجميع التعليمات البرمجية الوسيطة، قابل للنقل ويعمل على العديد من أنظمة Unix والأنظمة الشبيهة بـ Unix (بما في ذلك macOS )، بالإضافة إلى Microsoft Windows والعديد من الأنظمة الأخرى.
- كلوزور سي إل (سي سي إل)
- كانت Clozure CL في الأصل نسخةً مجانيةً ومفتوحة المصدر من لغة ماكنتوش كومون ليسب. وكما يشير تاريخها، فقد كُتبت CCL لنظام ماكنتوش، ولكنها تعمل الآن على أنظمة macOS و FreeBSD و Linux و Solaris و Windows . وتدعم كل منصةٍ منها منافذ x86 بنظامي 32 و64 بت . بالإضافة إلى ذلك، توجد منافذ Power PC لأنظمة macOS وLinux. كانت CCL تُعرف سابقًا باسم OpenMCL، ولكن لم يعد يُستخدم هذا الاسم لتجنب الخلط بينها وبين النسخة مفتوحة المصدر من ماكنتوش كومون ليسب.
- جامعة كليرمونت الطبية
- برنامج CMUCL، الذي طُوّر في الأصل من جامعة كارنيجي ميلون ، يُدار الآن كبرنامج مجاني ومفتوح المصدر من قِبل مجموعة من المتطوعين. يستخدم البرنامج مُترجمًا سريعًا للتعليمات البرمجية الأصلية. وهو متوفر لأنظمة لينكس وبي إس دي لمعالجات إنتل x86؛ ولينكس لمعالجات ألفا؛ وماك أو إس لمعالجات إنتل x86 وباور بي سي؛ وسولاريس وإيريكس وإتش بي-يو إكس على منصاتها الأصلية.
- كورمان لغة ليسب الشائعة
- لأنظمة مايكروسوفت ويندوز. في يناير 2015، تم نشر كورمان ليسب بموجب ترخيص MIT. [ 24 ]
- لغة Common Lisp القابلة للتضمين (ECL)
- تتضمن لغة ECL مترجمًا ومترجمًا للغة البايت كود. كما يمكنها ترجمة كود Lisp إلى لغة الآلة باستخدام مترجم C. ثم تقوم ECL بترجمة كود Lisp إلى C، وترجمة كود C باستخدام مترجم C، ويمكنها بعد ذلك تحميل كود الآلة الناتج. من الممكن أيضًا تضمين ECL في برامج C ، وكود C في برامج Common Lisp.
- لغة جنو كومون ليسب (GCL)
- مُصرّف لغة ليسب التابع لمشروع جنو . على الرغم من عدم توافقه الكامل مع معايير ANSI حتى الآن، إلا أن GCL هو الخيار الأمثل للعديد من المشاريع الكبيرة، بما في ذلك الأدوات الرياضية Maxima و AXIOM و ACL2 (تاريخيًا) . يعمل GCL على نظام لينكس ضمن إحدى عشرة بنية مختلفة، وكذلك على أنظمة ويندوز وماك أو إس وسولاريس وفري بي إس دي .
- لغة ماكنتوش الشائعة (MCL)
- الإصدار 5.2 لأجهزة Apple Macintosh المزودة بمعالج PowerPC والتي تعمل بنظام macOS X هو إصدار مفتوح المصدر. يعمل برنامج RMCL (المبني على MCL 5.2) على أجهزة Apple Macintosh المزودة بمعالجات Intel باستخدام برنامج Rosetta لتحويل الملفات الثنائية من Apple.
- مانكاي كومون ليسب (MKCL)
- يُعدّ MKCL فرعًا من ECL ، ويركّز على الموثوقية والاستقرار وجودة الكود الشاملة من خلال نظام تشغيل مُعاد تصميمه بشكل كبير، يدعم تعدد الخيوط بشكل أصلي. على نظام لينكس، يتميّز MKCL بنظام تشغيل متوافق تمامًا مع معيار POSIX.
- موفيتز
- يقوم بتنفيذ بيئة لغة ليسب لأجهزة الكمبيوتر x86 دون الاعتماد على أي نظام تشغيل أساسي.
- مدونة السكان
- تُطبّق Poplog نسخةً من لغة CL، باستخدام POP-11 ، مع إمكانية دعم Prolog و Standard ML (SML)، مما يسمح بالبرمجة بلغات متعددة. لغة التنفيذ في جميع هذه الحالات هي POP-11، والتي تُجمّع تدريجيًا. كما تحتوي على محرر نصوص مُدمج يُشبه Emacs ، يتواصل مع المُجمّع.
- لغة البرمجة المشتركة لبنك الصلب (SBCL)
- فرع من لغة CMUCL . "بشكل عام، تتميز SBCL عن CMU CL بالتركيز الأكبر على سهولة الصيانة." [ 25 ] تعمل SBCL على جميع المنصات التي تعمل عليها CMUCL، باستثناء HP/UX؛ بالإضافة إلى ذلك، تعمل على أنظمة Linux لمعالجات AMD64 وPowerPC وSPARC وMIPS، وأنظمة Windows x86 وAMD64. [ 26 ] لا تستخدم SBCL مترجمًا افتراضيًا؛ حيث تُترجم جميع التعبيرات إلى كود أصلي ما لم يُفعّل المستخدم المترجم. يُولّد مُترجم SBCL كودًا أصليًا سريعًا وفقًا لإصدار سابق من لعبة معايير لغات الحاسوب . [ 27 ]
- يوفاسوفت كومون ليسب
- نسخة من برنامج CLISP لنظام التشغيل Windows مع نواة مكتوبة بلغة C++.
تطبيقات أخرى
- أوستن كيوتو كومون ليسب
- تطور لغة كيوتو كومون ليسب بواسطة بيل شيلتر .
- لغة الفراشة الشائعة
- تطبيق مكتوب بلغة Scheme لحاسوب BBN Butterfly متعدد المعالجات. [ 28 ] [ 29 ]
- انقر
- مترجم من لغة Common Lisp إلى لغة C. [ 30 ]
- كلوي
- لغة Common Lisp لأجهزة الكمبيوتر الشخصية من تطوير Symbolics .
- كودميست كومون ليسب
- يُستخدم في النسخة التجارية من نظام الجبر الحاسوبي Axiom. [ 31 ] [ 32 ]
- لغتها الشائعة
- تطبيق مبكر لجهاز أبل ماكنتوش من شركة إكسبيرتيليجنس.
- لغة غولدن كومون ليسب
- تطبيق للحاسوب الشخصي من شركة GoldHill Inc. [ 33 ] [ 34 ]
- لغة إيبوكي الشائعة
- نسخة تجارية من لغة كيوتو كومون ليسب.
- لغة كيوتو الشائعة
- أول مترجم للغة Common Lisp يستخدم لغة C كلغة مستهدفة. وتعود أصول لغات GCL وECL وMKCL إلى هذا التطبيق للغة Common Lisp.
- ل
- نسخة صغيرة من لغة Common Lisp للأنظمة المدمجة طورتها شركة IS Robotics، والتي أصبحت الآن iRobot [ 35 ]
- آلات لغة ليسب (من Symbolics ، TI [ 36 ] [ 37 ] و Xerox [ 38 ] )
- قدّمت تطبيقات للغة Common Lisp بالإضافة إلى لهجتها الأصلية من لغة Lisp (Lisp Machine Lisp أو Interlisp). كما كان CLOS متاحًا أيضًا. وقدّمت Symbolics نسخة محسّنة من Common Lisp. [ 39 ] [ 40 ] [ 41 ]
- لغة بروسيون الشائعة
- تطبيق لنظامي التشغيل ويندوز وماك أو إس، يستخدمه فرانز لإصدار ويندوز الخاص بهم من برنامج أليجرو سي إل.
- ستار سافاير كومون ليسب
- تطبيق للحاسوب الشخصي.
- SubL
- [ 42 ] نسخة معدلة من لغة Common Lisp تستخدم لتنفيذ نظام Cyc القائم على المعرفة.
- لغة Common Lisp من المستوى الأعلى
- تطبيق مبكر للتنفيذ المتزامن. [ 43 ]
- WCL
- تطبيق مكتبة مشتركة. [ 44 ] [ 45 ]
- لغة VAX Common Lisp
- تطبيق شركة Digital Equipment Corporation الذي كان يعمل على أنظمة VAX التي تعمل بنظامي VMS أو ULTRIX .
- XLISP
- تم كتابة هذا التطبيق بواسطة ديفيد بيتز. [ 46 ]
التطبيقات
تُستخدم لغة Common Lisp لتطوير تطبيقات البحث (غالبًا في مجال الذكاء الاصطناعي )، من أجل التطوير السريع للنماذج الأولية أو للتطبيقات المنشورة.
تُستخدم لغة Common Lisp في العديد من التطبيقات التجارية، بما في ذلك موقع Yahoo! Store للتجارة الإلكترونية، الذي شارك في تطويره في الأصل بول غراهام ، ثم أُعيدت كتابته لاحقًا بلغة C++ ولغة Perl . [ 47 ] ومن الأمثلة البارزة الأخرى:
- ACT-R ، وهو بنية معرفية تستخدم في عدد كبير من المشاريع البحثية.
- مساعد المُصرِّح، [ 48 ] [ 49 ] وهو نظام كبير قائم على القواعد تستخدمه شركة أمريكان إكسبريس لتحليل طلبات الائتمان.
- Cyc ، وهو مشروع طويل الأمد لإنشاء نظام قائم على المعرفة يوفر كمية هائلة من المعرفة المنطقية.
- Gensym G2 ، وهو نظام خبير في الوقت الحقيقي ومحرك قواعد الأعمال [ 50 ]
- Genworks GDL، [ 51 ] يعتمد على نواة Gendl مفتوحة المصدر.
- بيئة التطوير لسلسلة ألعاب الفيديو Jak and Daxter ، التي طورتها شركة Naughty Dog .
- محرك البحث عن الأسعار المنخفضة من شركة ITA Software ، والذي تستخدمه مواقع السفر مثل Orbitz و Kayak.com وشركات الطيران مثل الخطوط الجوية الأمريكية و Continental Airlines و US Airways .
- Mirai ، وهي مجموعة برامج رسومات ثلاثية الأبعاد، معروفة باستخدامها في تصميم شخصية غولوم في أفلام سيد الخواتم.
- Opusmodus هو نظام لتأليف الموسيقى يعتمد على لغة Common Lisp، ويستخدم في التأليف بمساعدة الكمبيوتر . [ 52 ]
- نظام التحقق من النموذج الأولي (PVS)، وهو بيئة آلية للمواصفات الرسمية والتحقق.
- PWGL هي بيئة برمجة مرئية متطورة تعتمد على لغة Common Lisp، وتستخدم في التأليف الموسيقي بمساعدة الحاسوب وتوليف الصوت. [ 53 ]
- بيانو، وهي مجموعة برامج تحليل طائرات كاملة، مكتوبة بلغة Common Lisp، [ 54 ] تستخدمها شركات مثل بوينغ وإيرباص ونورثروب غرومان . [ 55 ]
- Grammarly ، وهي منصة لتحسين الكتابة باللغة الإنجليزية، تحتوي على محرك القواعد الأساسي الخاص بها مكتوب بلغة Common Lisp. [ 56 ]
- أداة التحليل وإعادة التخطيط الديناميكي (DART)، والتي يقال إنها وحدها قد سددت خلال السنوات من 1991 إلى 1995 جميع استثمارات داربا في أبحاث الذكاء الاصطناعي على مدى ثلاثين عامًا.
- برنامج " Deep Space 1 " التابع لمختبر الدفع النفاث التابع لناسا ، وهو برنامج حائز على جوائز [ 57 ] Common Lisp [ 58 ] لتشغيل المركبة الفضائية Deep Space One آليًا.
- SigLab، وهي منصة Common Lisp لمعالجة الإشارات المستخدمة في الدفاع الصاروخي، تم بناؤها بواسطة شركة Raytheon . [ 54 ]
- نظام تخطيط مهمة المريخ باثفايندر التابع لناسا . [ 59 ]
- SPIKE، وهو نظام جدولة للمراصد والأقمار الصناعية الأرضية أو الفضائية، ولا سيما تلسكوب هابل الفضائي ، [ 60 ] مكتوب بلغة Common Lisp. [ 61 ]
- تم استخدام لغة Common Lisp لإنشاء نموذج أولي لجامع القمامة الخاص بـ .NET Common Language Runtime من Microsoft . [ 62 ]
- كانت النسخة الأصلية من ريديت مكتوبة بلغة بايثون ، إلا أن المطورين انتقلوا لاحقًا إلى بايثون بسبب نقص المكتبات المتاحة للغة كومون ليسب، وفقًا لمدونة رسمية كتبها ستيف هوفمان ، أحد مؤسسي ريديت . [ 63 ] وقد تم نشر شفرة المصدر لنسخة ريديت الأولى (الإصدار الأول) وتحديثها. [ 64 ]
- منصة Hacker News، التي تحولت إلى لغة Common Lisp (مع تطبيق SBCL) في عام 2024. [ 65 ]
توجد أيضًا تطبيقات مفتوحة المصدر مكتوبة بلغة Common Lisp، مثل:
- ACL2 ، وهو برنامج إثبات نظريات آلي كامل الميزات لنسخة تطبيقية من لغة Common Lisp.
- أكسيوم ، نظام جبر حاسوبي متطور .
- محرر Lem ، وهو محرر متعدد الأغراض يشبه Emacs، مكتوب وقابل للتوسيع بلغة Common Lisp.
- ماكسيما ، نظام جبر حاسوبي متطور ، يعتمد على ماكسيما.
- OpenMusic ، بيئة برمجة مرئية كائنية التوجه تعتمد على لغة Common Lisp، وتستخدم في التأليف الموسيقي بمساعدة الحاسوب .
- Pgloader، [ 66 ] وهو برنامج تحميل بيانات لـ PostgreSQL ، تمت إعادة كتابته من Python إلى Common Lisp. [ 67 ]
- Stumpwm، مدير نوافذ X11 يعمل بنظام التجانب، ويعتمد على لوحة المفاتيح، ومكتوب بالكامل بلغة Common Lisp.
- كاندريا، [ 68 ] لعبة مفتوحة المصدر تم نشرها على منصة ستيم في عام 2023. [ 69 ]
انظر أيضاً
مراجع
- ↑ "إجراءات معايير ANSI - 28 ديسمبر 2018" (ملف PDF) . ansi.org . مؤرشف (ملف PDF) من الأصل في 12 أبريل 2021.
- ↑ مقتبس من غلاف المعيار المذكور. ANSI INCITS 226-1994 [S2008]، معروض للبيع على صفحة وثيقة المعيار. مؤرشف في 27 سبتمبر 2020، في Wayback Machine .
- ↑ "CLHS: حول Common Lisp HyperSpec (TM)" . lispworks.com .
- ↑ "CLHS: القسم 1.1.2" . lispworks.com .
- ↑ "تطبيقات لغة Common Lisp: دراسة استقصائية" . مؤرشف من الأصل في 21 أبريل 2012. تم الاطلاع عليه في 22 ديسمبر 2007 .
- ↑ "برامج LISP القديمة لا تزال تعمل في Common Lisp" . تم الاطلاع عليه في 13 مايو 2015 .
- ↑ "جذور لغة يو شيانغ"، رسالة من جون إل وايت، 1982" . Cmu.edu .
- ↑ "فهرس البريد" . Cl-su-ai.lisp.se .
- ↑ "ردود الفعل التلقائية ضد نظام LOOP وغيرها من ظواهر البريد الإلكتروني" . Ccs.mit.edu . مؤرشف من الأصل في 8 أغسطس 2012. تم الاطلاع عليه في 25 يوليو 2026 .
- ↑ ستيل، جاي إل. الابن (15 أغسطس 1982). "نظرة عامة على لغة COMMON LISP". وقائع ندوة ACM لعام 1982 حول لغة LISP والبرمجة الوظيفية - LFP '82 . ACM. الصفحات 98-107 . doi : 10.1145/800068.802140 . ISBN 9780897910828. S2CID 14517358 .
- ↑ ريدي، أبيشيك (22 أغسطس 2008). "ميزات لغة البرمجة الشائعة (Common Lisp)" .
- ↑ "دعم يونيكود" . موسوعة كومون ليسب . تم الاطلاع عليه بتاريخ 21 أغسطس 2008 .
- 1 2 ريتشارد ب. غابرييل؛ كينت م. بيتمان (يونيو 1988). "قضايا تقنية تتعلق بالفصل في خلايا الدوال وخلايا القيم" . LISP والحساب الرمزي . 1 (1): 81-101 . doi : 10.1007/bf01806178 . S2CID 26716515 .
- ↑ "CLHS: القسم 3.1.7" . Lispworks.com . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "CLHS: Function FLOOR, FFLOOR, CEILING, FCEILING..." Lispworks.com . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "CLHS: Accessor GETHASH" . Lispworks.com . تم الاطلاع عليه في 25 يوليو 2026 .
- ↑ "Let Over Lambda" . letoverlambda.com .
- ↑ بيتر سيبل (7 أبريل 2005). لغة ليسب العملية . دار نشر أبريس. رقم ISBN 978-1-59059-239-7.
- ↑ "أنماط التصميم في البرمجة الديناميكية" . norvig.com .
- ↑ "مرحباً بكم في Common-Lisp.net!" . Common-lisp.net . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "CLOCC - مجموعة أكواد Common Lisp المفتوحة" . Clocc.sourceforge.net . تم الاطلاع عليه في 25 يوليو 2026 .
- ↑ "32.6. بدء التسليم السريع باستخدام CLISP" . clisp.cons.org .
- ↑ "Armed Bear Common Lisp (ABCL) - ANSI Common Lisp على آلة جافا الافتراضية" . Armedbear.common-lisp.dev . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "مصادر كورمان ليسب متاحة الآن" . 5 يناير 2015.
- ↑ "التاريخ وحقوق النشر" . لغة البرمجة المشتركة لبنك ستيل .
- ↑ "طاولة المنصة" . Steel Bank Common Lisp .
- ↑ "ما هي البرامج الأسرع؟ - لعبة قياس أداء لغات البرمجة" . 20 مايو 2013. مؤرشف من الأصل في 20 مايو 2013.
- ↑ "الحزمة: lang/lisp/impl/bbn/" . cs.cmu.edu .
- ↑ "التطورات الحديثة في لغة Butterfly Lisp، 1987، وقائع AAAI" (ملف PDF) . aaai.org . مؤرشف (ملف PDF) من الأصل في 11 أكتوبر 2015.
- ↑ بوركارت، أو.؛ غوريك، دبليو.؛ نوتزن، إتش. (22 يونيو 1992). "CLICC: منهج جديد لتجميع برامج Common Lisp إلى لغة C". CiteSeerX 10.1.1.38.1282 .
{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal= - ↑ "codemist.co.uk" . lisp.codemist.co.uk .
- ↑ "البديهية، الأفق الزمني لمدة 30 عامًا، الصفحة 43" (PDF) .
- ↑ "مطور لغة Common Lisp الذهبية" . goldhill-inc.com .
- ↑ غولدن كومون ليسب: منهج عملي، ديفيد ج. ستيل، يونيو 2000، شركة أديسون ويسلي للنشر
- ↑ بروكس، رودني أ.؛ وآخرون، (22 يونيو 1995). "L - لغة ليسب شائعة للأنظمة المدمجة". CiteSeerX 10.1.1.2.1953 .
{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal= - ^ “مفاهيم برمجة TI Explorer” (PDF) .
- ↑ "مرجع لغة ليسب لبرنامج TI Explorer" (ملف PDF) .
- ↑ "ملاحظات إصدار Medley Lisp" (ملف PDF) .
- ↑ "قاموس الرموز في لغة ليسب الشائعة" (ملف PDF) . trailing-edge.com . مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 22 أبريل 2015.
- ↑ "مفاهيم لغة Common Lisp الرمزية" (ملف PDF) . trailing-edge.com . مؤرشف (ملف PDF) من الأصل بتاريخ 22 أبريل 2015.
- ↑ "بنى البرمجة الرمزية في لغة Common Lisp" (ملف PDF) . trailing-edge.com . مؤرشف (ملف PDF) من الأصل بتاريخ 22 أبريل 2015.
- ^ "مرجع SubL – Cycorp" . cyc.com .
- ↑ "المستوى الأعلى من لغة Common Lisp - مجموعة الحفاظ على البرمجيات" . softwarepreservation.computerhistory.org .
- ↑ WCL: تقديم تطبيقات Common Lisp فعالة تحت نظام Unix، وقائع مؤتمر ACM لعام 1992 حول LISP والبرمجة الوظيفية ، الصفحات 260-269
- ↑ "commonlisp.net :: WCL" . pgc.com . مؤرشف من الأصل في 5 أبريل 2016. تم الاطلاع عليه في 25 مارس 2016 .
- ↑ "الحزمة: lang/lisp/impl/xlisp/" . cs.cmu.edu .
- ↑ "التفوق على المتوسطات" . paulgraham.com .
- ↑ "مساعد المُصرِّح" (ملف PDF) . aaai.org . مؤرشف (ملف PDF) من النسخة الأصلية في 4 يونيو 2011.
- ↑ مساعد مُصرِّح أمريكان إكسبريس، مؤرشف في 12 ديسمبر 2009، على موقع Wayback Machine
- ↑ تطوير التطبيقات في الوقت الحقيقي. مؤرشف في 2 أغسطس 2016 على موقع Wayback Machine . Gensym. تم الاطلاع عليه في 16 أغسطس 2016.
- ↑ "أدوات تطوير الهندسة القائمة على المعرفة من Genworks International" . Genworks.com . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "Opusmodus" . Opusmodus.com . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ PWGL – الصفحة الرئيسية مؤرشفة في 3 مايو 2011، في Wayback Machine ، تم استرجاعها في 17 يوليو 2013.
- 1 2 "الفضاء الجوي - لغة ليسب الشائعة" . lisp-lang.org .
- ↑ "مستخدمو البيانو، تم استرجاعها من صفحة الشركة المصنعة" .
- ↑ "Grammarly.com، تشغيل لغة Lisp في بيئة الإنتاج" . 26 يونيو 2015.
- ↑ "الوكيل البعيد" . ti.arc.nasa.gov .
- ↑ "الاستماع في مختبر الدفع النفاث" .
- ↑ "تطبيقات عملاء شركة فرانز: ناسا" . franz.com .
- ↑ نظام تخطيط وجدولة التجارب السريرية . Stsci.edu. تم الاطلاع عليه في 17 يوليو 2013.
- ↑ "تطبيقات عملاء شركة فرانز: معهد تلسكوب الفضاء" . franz.com .
- ↑ "كيف بدأ كل شيء... أو ما يُعرف بميلاد CLR" . microsoft.com . 28 أغسطس 2023.
- ↑ هوفمان، ستيف. "على لغة الليسب" . تم التصويت بالإيجاب . مؤرشف من الأصل في 17 مايو 2018. تم الاسترجاع في 11 مايو 2019 .
- ↑ "tamurashingo/reddit1.0" . GitHub.com . 24 يوليو 2026. تم الاطلاع عليه في 25 يوليو 2026 .
- ↑ "موقع Hacker News يعمل الآن باستخدام لغة Common Lisp" . Lisp-journey.gitlab.io . 26 مايو 2025. تم الاطلاع عليه في 25 يوليو 2026 .
- ↑ "pgloader" . Pgloader.io . تم الاطلاع عليه بتاريخ 25 يوليو 2026 .
- ↑ "لماذا برنامج pgloader أسرع بكثير؟" . Tapoueh.org . 14 مايو 2014.
- ^ "كاندريا" . كاندريا.كوم . تم الاسترجاع في 25 يوليو، 2026 .
- ↑ "تقرير تجربة: كاندريا، لعبة مكتوبة بلغة كومون ليسب" (ملف PDF) . Raw.githubusercontent.com .
فهرس
قائمة زمنية للكتب المنشورة (أو التي ستنشر قريباً) حول لغة Common Lisp (اللغة) أو حول البرمجة باستخدام Common Lisp (وخاصة برمجة الذكاء الاصطناعي).
- جاي إل. ستيل : لغة كومون ليسب، الطبعة الأولى ، دار النشر الرقمية، 1984، رقم ISBN 0-932376-41-X
- رودني ألين بروكس : البرمجة بلغة كومون ليسب ، جون وايلي وأولاده، 1985، رقم ISBN 0-471-81888-7
- ريتشارد ب. غابرييل : أداء وتقييم أنظمة لغة ليسب ، مطبعة معهد ماساتشوستس للتكنولوجيا، 1985، رقم ISBN 0-262-57193-5ملف PDF
- روبرت ويلينسكي : Common LISPcraft ، دبليو دبليو نورتون وشركاه، 1986، رقم ISBN 0-393-95544-3
- يوجين شارنياك ، كريستوفر ك. ريسبك ، درو ف. ماكديرموت ، جيمس ر. ميهان : برمجة الذكاء الاصطناعي، الطبعة الثانية ، لورانس إيرلبوم، 1987، رقم ISBN 0-89859-609-2
- ويندي ل. ميلنر : لغة ليسب الشائعة: دليل تعليمي ، برنتيس هول، 1987، رقم ISBN 0-13-152844-0
- ديبورا جي. تاتار : دليل المبرمج إلى لغة Common Lisp ، لونغمان للتعليم العالي، 1987، رقم ISBN 0-13-728940-5
- تاييتشي يواسا ، ماسامي هاجيا : مقدمة إلى لغة Common Lisp ، دار النشر Elsevier Ltd، 1987، رقم ISBN 0-12-774860-1
- كريستيان كوينيك ، جيروم شايو : تطور لغة ليسب وتوحيدها ، دار نشر آي أو إس، 1988، رقم ISBN 90-5199-008-1
- تاييتشي يواسا ، ريتشارد ويراوخ ، ياسوكو كيتاجيما : تدريب على لغة ليسب الشائعة ، دار النشر الأكاديمية، 1988، رقم ISBN 0-12-774861-X
- ويد ل. هينيسي : لغة ليسب الشائعة ، ماكجرو هيل، 1989، رقم ISBN 0-07-028177-7
- توني هاسيمر ، جون دومينيك : برمجة لغة ليسب الشائعة للذكاء الاصطناعي ، دار نشر أديسون-ويسلي التعليمية، 1989، رقم ISBN 0-201-17579-7
- سونيا إي. كين : البرمجة الكائنية في لغة Common Lisp: دليل المبرمج إلى CLOS ، أديسون-ويسلي، 1989، ISBN 0-201-17589-4
- ديفيد جاي ستيل : لغة ليسب الذهبية: منهج عملي ، أديسون ويسلي، 1989، رقم ISBN 0-201-41653-0
- ديفيد س. توريتزكي : لغة ليسب الشائعة: مقدمة مبسطة للحساب الرمزي ، بنجامين-كامينغز، 1989، رقم ISBN 0-8053-0492-4طبعة دوفر المعاد طباعتها (2013) بصيغة PDF /Web 978-0486498201
- كريستوفر ك. ريسبيك ، روجر سي. شانك : داخل المنطق القائم على القضية ، لورانس إرلبوم، 1989، ISBN 0-89859-767-6
- باتريك وينستون ، بيرتولد هورن : لغة ليسب، الطبعة الثالثة ، أديسون-ويسلي، 1989، رقم ISBN 0-201-08319-1الويب
- جيرارد غازدار ، كريس ميليش : معالجة اللغة الطبيعية في لغة ليسب: مقدمة في اللغويات الحاسوبية ، دار نشر أديسون-ويسلي لونغمان، 1990، رقم ISBN 0-201-17825-7
- باتريك ر. هاريسون : لغة ليسب الشائعة والذكاء الاصطناعي ، برنتيس هول بي تي آر، 1990، رقم ISBN 0-13-155243-0
- تيموثي كوشمان : دليل لغة الليسب الشائعة ، جون وايلي وأولاده، 1990، رقم ISBN 0-471-50308-8
- دبليو. ريتشارد ستارك : لغة ليسب، وقواعدها، ومنطقها ، دار نشر سبرينغر فيرلاغ نيويورك، 1990، رقم ISBN 978-0-387-97072-1ملف PDF
- مولي م. ميلر ، إريك بنسون : أسلوب وتصميم لغة الليسب ، دار النشر الرقمية، 1990، رقم ISBN 1-55558-044-0
- جاي إل. ستيل : لغة كومون ليسب ، الطبعة الثانية ، دار النشر الرقمية، 1990، رقم ISBN 1-55558-041-6الويب
- روبن جونز، وكلايف ماينارد ، وإيان ستيوارت: فن برمجة لغة ليسب ، دار نشر سبرينغر فيرلاغ نيويورك، 1990، رقم ISBN 978-3-540-19568-9ملف PDF
- ستيفن ل. تانيموتو : عناصر الذكاء الاصطناعي باستخدام لغة Common Lisp ، دار نشر علوم الحاسوب، 1990، رقم ISBN 0-7167-8230-8
- بيتر لي : مواضيع في تطبيق اللغات المتقدمة ، مطبعة معهد ماساتشوستس للتكنولوجيا، 1991، رقم ISBN 0-262-12151-4
- جون هـ. رايلي : كتاب تمارين لغة ليسب الشائعة ، برنتيس هول، 1991، رقم ISBN 0-13-155797-1
- بيتر نورفيج : نماذج برمجة الذكاء الاصطناعي: دراسات حالة في لغة Common Lisp ، مورغان كوفمان، 1991، رقم ISBN 1-55860-191-0الويب
- غريغور كيتزاليس ، جيم دي ريفيير ، دانيال جي. بوبرو : فن بروتوكول الكائن الفائق ، مطبعة معهد ماساتشوستس للتكنولوجيا، 1991، رقم ISBN 0-262-61074-4
- جو أ. لوليس ، مولي م. ميلر : فهم نظام كائنات لغة ليسب الشائعة (CLOS) ، دار النشر الرقمية، 1991، رقم ISBN 0-13-717232-X
- مارك واتسون: وحدات لغة ليسب الشائعة: الذكاء الاصطناعي في عصر الشبكات العصبية ونظرية الفوضى ، دار نشر سبرينغر فيرلاغ نيويورك، 1991، رقم ISBN 0-387-97614-0ملف PDF
- جيمس ل. نويز : الذكاء الاصطناعي باستخدام لغة Common Lisp: أساسيات المعالجة الرمزية والرقمية ، دار نشر جونز وبارتليت، 1992، رقم ISBN 0-669-19473-5
- ستيوارت سي. شابيرو : لغة ليسب الشائعة: منهج تفاعلي ، دار نشر علوم الحاسوب، 1992، رقم ISBN 0-7167-8218-9، ويب/PDF [ تمت إزالة الرابط ]
- كينيث د. فوربس ، يوهان دي كلير : بناء حلول المشكلات ، مطبعة معهد ماساتشوستس للتكنولوجيا، 1993، ISBN 0-262-06157-0
- أندرياس بابكه : البرمجة الكائنية التوجه: منظور CLOS ، مطبعة معهد ماساتشوستس للتكنولوجيا، 1993، رقم ISBN 0-262-16136-2
- بول غراهام : عن التلعثم ، برنتيس هول، 1993، رقم ISBN 0-13-030552-9، ويب/PDF
- بول غراهام : لغة ANSI Common Lisp ، برنتيس هول، 1995، رقم ISBN 0-13-370875-6
- أوتو ماير : Programmieren in Common Lisp ، ألماني، Spektrum Akademischer Verlag، 1995، ISBN 3-86025-710-2
- ستيفن سليد : لغة ليسب الشائعة الموجهة للكائنات ، برنتيس هول، 1997، رقم ISBN 0-13-605940-6
- ريتشارد ب. غابرييل : أنماط البرمجيات: حكايات من مجتمع البرمجيات ، مطبعة جامعة أكسفورد، 1998، رقم ISBN 0-19-512123-6ملف PDF
- تايتشي يواسا ، هيروشي جي أوكونو : تقنية اللثغة المتقدمة ، CRC، 2002، ISBN 0-415-29819-9
- ديفيد ب. لامكينز : لغة ليسب الناجحة: كيفية فهم واستخدام لغة ليسب الشائعة ، bookfix.com، 2004. ISBN 3-937526-00-5الويب
- بيتر سيبل : لغة ليسب العملية ، دار نشر أبريس، 2005. رقم ISBN 1-59059-239-5الويب
- دوغ هويت : ليت أوفر لامدا ، Lulu.com، 2008، ISBN 1-4357-1275-7الويب
- جورج ف. لوغر ، ويليام أ. ستابلفيلد : خوارزميات الذكاء الاصطناعي، وهياكل البيانات، والمصطلحات في لغات البرمجة برولوج، وليسب، وجافا ، أديسون ويسلي، 2008، رقم ISBN 0-13-607047-7ملف PDF
- كونراد بارسكي : أرض ليسب: تعلم البرمجة بلغة ليسب، لعبة تلو الأخرى!، دار نشر نو ستارش، 2010، رقم ISBN 1-59327-200-6الويب
- بافيل بينيف : حكايات الويب بلغة ليسب ، لينبب، 2013، ويب
- إدموند ويتز : وصفات بلغة الليسب الشائعة ، دار نشر أبريس، 2015، رقم ISBN 978-1-484211-77-9الويب
- باتريك إم. كروسينوتو : البرمجة الوظيفية والبرمجة الوصفية، التفاعل في لغة اللثغة المشتركة ، Springer Fachmedien Wiesbaden 2016، ISBN 978-3-658-13743-4الويب
روابط خارجية
- يُعد موقع Common-Lisp.net أحد المستودعات الرئيسية لبرامج Common Lisp المجانية .
- كتاب طبخ لغة الشك الشائعة .
- قائمة Awesome CL ، وهي قائمة منسقة من أطر عمل ومكتبات Common Lisp.
- يحتوي موقع lisp-lang.org على وثائق وعرض لقصص النجاح.
- Quicklisp - مدير مكتبات عالي الجودة وشائع الاستخدام للغة Common Lisp.
- لمحة عامة عن تاريخ لغة Common Lisp: "التاريخ" . Common Lisp HyperSpec .
- مرجع سريع للغة Common Lisp - نظرة عامة موجزة على لغة Common Lisp القياسية.
- مقالات بلانيت ليسب حول لغة ليسب الشائعة.
- يقدم موقع Quickdocs ملخصًا للوثائق ومعلومات التبعية للعديد من مشاريع Quicklisp.
- CLiki ، ويكي لأنظمة Common Lisp المجانية والمفتوحة المصدر التي تعمل على أنظمة شبيهة بنظام Unix.
- لغة الشفرة الشائعة
- لغات البرمجة القائمة على الفئات
- برامج مجانية متعددة المنصات
- برامج متعددة المنصات
- لغات البرمجة الديناميكية
- لغات البرمجة ذات الكتابة الديناميكية
- لغات برمجة ذات بنية قابلة للتوسيع
- اللغات الوظيفية
- لغة البرمجة ليسب
- عائلة لغات البرمجة ليسب
- لغات البرمجة متعددة الأنماط
- لغات البرمجة الكائنية التوجه
- لغات البرمجة الإجرائية
- لغات البرمجة التي تم إنشاؤها عام 1984
