سلبيات
في برمجة الحاسوب ، تُعدّ consالدالة ` cons` ( أو ` cons` ) دالة أساسية في معظم لهجات لغة البرمجة Lisp. تقوم هذه الدالة بإنشاء كائنات ذاكرة تحتوي على قيمتين أو مؤشرين إلى قيمتين. تُعرف هذه الكائنات باسم خلايا (cons)، أو تعبيرات غير ذرية (NATSes)، أو أزواج (cons). في مصطلحات Lisp ، يعني التعبير "cons x onto y " إنشاء كائن جديد باستخدام ` cons` . يتكون الزوج الناتج من نصف أيسر، يُشار إليه باسم `cons` (العنصر الأول، أو محتويات جزء العنوان من السجل ) ، ونصف أيمن، يُشار إليه باسم `cons` ( العنصر الثاني، أو محتويات جزء الإنقاص من السجل ) .cons(cons xy)carcdr
يرتبط هذا بشكل فضفاض بمفهوم الكائن الموجه للبناء ، والذي يقوم بإنشاء كائن جديد بالنظر إلى الوسائط، ويرتبط بشكل أوثق بوظيفة البناء لنظام نوع البيانات الجبرية .
تُعدّ كلمة "cons" وتعبيرات مثل "to cons onto" جزءًا من مصطلحات البرمجة الوظيفية العامة . أحيانًا تُنطق المعاملات:: التي لها غرض مشابه، خاصةً في سياق معالجة القوائم، "cons". (من الأمثلة الجيدة على ذلك المعامل في لغات ML و Scala و F# و Lean و Rocq و Elm ، أو :المعامل في Haskell ، الذي يُضيف عنصرًا إلى بداية القائمة).
يستخدم
على الرغم من أنه يمكن استخدام خلايا cons للاحتفاظ بأزواج مرتبة من البيانات، إلا أنها تستخدم بشكل أكثر شيوعًا لإنشاء هياكل بيانات مركبة أكثر تعقيدًا، ولا سيما القوائم والأشجار الثنائية .
أزواج مُرتبة
على سبيل المثال، يُنشئ تعبير لغة ليسب خليةً تحتوي على القيمة 1 في نصفها الأيسر (ما يُسمى الحقل) والقيمة 2 في نصفها الأيمن ( الحقل). في تدوين ليسب، تبدو القيمة كما يلي:(cons12)carcdr(cons12)
(1.2)
لاحظ النقطة بين 1 و 2؛ يشير هذا إلى أن التعبير S هو "زوج منقط" (ما يسمى "زوج cons")، بدلاً من "قائمة".
القوائم

cons:( cons 42 ( cons 69 ( cons 613 nil )))list:( القائمة 42 69 613 )في لغة ليسب، تُنفَّذ القوائم باستخدام أزواج cons. وبشكل أكثر تحديدًا، فإن أي بنية قائمة في ليسب تكون إما:
- قائمة فارغة
()، وهي كائن خاص يُطلق عليه عادةً اسمnil. - خلية cons التي
carتمثل العنصر الأول في القائمة والتيcdrتمثل قائمة تحتوي على بقية العناصر.
يشكل هذا أساس بنية قائمة مرتبطة أحادية بسيطة، يمكن التلاعب بمحتوياتها باستخدام consو carو cdr. لاحظ أن nilهي القائمة الوحيدة التي لا تُعدّ زوجًا سلبيًا. على سبيل المثال، لنفترض قائمة عناصرها 1 و2 و3. يمكن إنشاء هذه القائمة في ثلاث خطوات:
- السلبيات 3 إلى
nilالقائمة الفارغة - السلبيات 2 على النتيجة
- السلبيات 1 على النتيجة
وهو ما يعادل التعبير الواحد التالي:
( cons 1 ( cons 2 ( cons 3 nil )))أو اختصارها:
( القائمة 1 2 3 )والقيمة الناتجة هي القائمة:
(1. (2. (3. لا شيء)))
أي
*--*--*--لا شيء | | | 1 2 3
والتي تُختصر عادةً إلى:
(1 2 3)
وبالتالي، consيمكن استخدامها لإضافة عنصر واحد إلى بداية قائمة مرتبطة موجودة. على سبيل المثال، إذا كانت x هي القائمة التي حددناها أعلاه، فستُنتج القائمة التالية:(cons5x)
(5 1 2 3)
هناك إجراء آخر مفيد للقوائم وهو append ، الذي يقوم بدمج قائمتين موجودتين (أي يجمع قائمتين في قائمة واحدة).
الأشجار
يمكن أيضًا إنشاء الأشجار الثنائية التي تخزن البيانات في أوراقهاcons فقط بسهولة باستخدام هذه الطريقة. على سبيل المثال، الكود التالي:
( cons ( cons 1 2 ) ( cons 3 4 ))النتائج في الشجرة:
((1. 2). (3. 4))
أي
* / \ * * / \ / \ 1 2 3 4
من الناحية الفنية، تُعدّ القائمة (1 2 3) في المثال السابق شجرة ثنائية، وهي شجرة غير متوازنة بشكل خاص. ولتوضيح ذلك، ما عليك سوى إعادة ترتيب الرسم التخطيطي:
*--*--*--لا شيء | | | 1 2 3
إلى ما يعادله التالي:
* / \ 1 * / \ 2 * / \ 3 لا شيء
استخدمه في المحادثة
قد تشير السلبيات إلى عملية تخصيص الذاكرة بشكل عام ، بدلاً من استخدام عمليات تدميرية من النوع المستخدم في لغات البرمجة الإجرائية. على سبيل المثال:
لقد قمت بتسريع الكود قليلاً عن طريق إضافة آثار جانبية بدلاً من جعله معقدًا بشكل مثير للسخرية.
التنفيذ الوظيفي
بما أن لغة ليسب تحتوي على دوال من الدرجة الأولى ، فإنه يمكن تنفيذ جميع هياكل البيانات، بما في ذلك خلايا cons، باستخدام الدوال. على سبيل المثال، في لغة سكيم :
( define ( cons x y ) ( lambda ( m ) ( m x y ))) ( define ( car z ) ( z ( lambda ( p q ) p ))) ( define ( cdr z ) ( z ( lambda ( p q ) q )))تُعرف هذه التقنية باسم ترميز تشيرش . وهي تُعيد تنفيذ عمليات cons و car و cdr ، باستخدام دالة كـ "خلية cons". يُعد ترميز تشيرش طريقة شائعة لتعريف هياكل البيانات في حساب لامدا البحت ، وهو نموذج نظري مجرد للحساب يرتبط ارتباطًا وثيقًا بلغة Scheme.
هذا التطبيق، على الرغم من أهميته الأكاديمية، إلا أنه غير عملي لأنه يجعل خلايا cons غير قابلة للتمييز عن أي إجراء آخر في Scheme، بالإضافة إلى أنه يُدخل أوجه قصور حسابية غير ضرورية.
مع ذلك، يمكن استخدام نفس نوع التشفير لأنواع البيانات الجبرية الأكثر تعقيدًا ذات المتغيرات، حيث قد يكون أكثر كفاءة من أنواع التشفير الأخرى. [ 1 ] يتميز هذا التشفير أيضًا بإمكانية تطبيقه في لغة ذات كتابة ثابتة لا تحتوي على متغيرات، مثل جافا ، باستخدام الواجهات بدلًا من تعابير لامدا.
انظر أيضاً
مراجع
- ↑ "التفسير الفعال من خلال تحويل أنواع البيانات والأنماط إلى دوال" (ملف PDF) . مؤرشف من النسخة الأصلية (PDF) بتاريخ 31 مارس 2010. تم الاطلاع عليه بتاريخ 1 مارس 2009 .
روابط خارجية
- SDRAW ، كود Common Lisp لرسم هياكل الخلايا. من ديفيد إس. توريتزكي.
- البرمجة الوظيفية
- لغة البرمجة ليسب
- أنواع البيانات المركبة
- أنواع البيانات
