Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

الاستيعابات (القوائم والمجموعات والقواميس)

الاستيعاب (comprehension) صياغة موجزة لبناء قائمة أو مجموعة أو قاموس من مصدر قابل للتكرار، بجملة واحدة بدل حلقة صريحة. تتبع لغة ص الترتيب العربيّ الطبيعيّ: رأس الحلقة أوّلًا، ثمّ الكلمة أنتج تفصله عن تعبير الناتج.

الصيغ الثلاث

قائمة:   [ لكل <متغيّر> في <مصدر> أنتج <ناتج> ]
مجموعة:  { لكل <متغيّر> في <مصدر> أنتج <ناتج> }
قاموس:   { لكل <متغيّر> في <مصدر> أنتج <مفتاح>: <قيمة> }
  • الأقواس [ ] أو المعقوفة { } تحيط بالاستيعاب كلّه.
  • الجزء «إذا <شرط>» — قبل أنتجاختياريّ في الأنواع الثلاثة؛ يرشّح العناصر قبل الإنتاج.
  • الكلمة أنتج تفصل رأس الحلقة عن الناتج. وهي كلمة سياقيّة (تُستعمَل أيضًا للتوليد في المولّدات).

لماذا هذا الترتيب؟ العربيّة تُقدّم السبب ثمّ الجواب: «لكلّ عنصرٍ في القائمة … أنتِج كذا». فالقارئ يعرف ما الذي نمرّ عليه قبل ما الذي نبنيه — على خلاف الترتيب البايثونيّ الذي يضع الناتج أوّلًا. (سابقة مماثلة: from … where … select في C# LINQ حيث المصدر أوّلًا.)


استيعاب القائمة

يبني قائمةً بتطبيق تعبير الناتج على كلّ عنصر (بعد الترشيح إن وُجد شرط).

متغير المضاعفات = [لكل س في [1، 2، 3، 4] أنتج س * 2]
اطبع_سطر(المضاعفات)
[2, 4, 6, 8]

مع شرط ترشيح قبل أنتج:

متغير الكبار = [لكل س في [1، 2، 3، 4، 5] إذا س > 2 أنتج س]
اطبع_سطر(الكبار)
[3, 4, 5]

استيعاب المجموعة

يبني مجموعة (عناصر فريدة، بلا تكرار) داخل { } بلا نقطتين بعد الناتج. تُزال التكرارات على قيمة الناتج، مع الحفاظ على ترتيب أوّل ظهور.

متغير الفريدة = {لكل س في [1، 2، 2، 3] أنتج س}
اطبع_سطر(الفريدة)
[1, 2, 3]

بما أنّ إزالة التكرار تكون على الناتج لا على المصدر، فإنّ تحويلًا يطوي مدخلاتٍ متمايزةً يُصغّر المجموعة:

متغير البواقي = {لكل س في [1، 2، 3، 4] أنتج س % 3}
اطبع_سطر(طول(البواقي))
3

المصدر [1، 2، 3، 4] متمايز (٤ عناصر)، لكنّ س % 3 يُنتج [1، 2، 0، 1] فتُطوى 1 المكرّرة ⇒ المجموعة [1، 2، 0] بطول ٣.


استيعاب القاموس

يبني قاموسًا داخل { } عندما يكون الناتج على هيئة مفتاح: قيمة (وجود : بعد الناتج هو ما يميّز القاموس عن المجموعة).

متغير المربّعات = {لكل س في [1، 2، 3] أنتج نص(س): س * س}
اطبع_سطر(المربّعات)
{"1": 1, "2": 4, "3": 9}
  • متغيّر الحلقة مفرد (لا يُفكّك زوجًا) ما دام المصدر مصفوفةً؛ أمّا حين يكون المصدر خريطةً فانظر فكّ الزوج أدناه.
  • عند تصادُم مفتاحين، يفوز الأخير (كالخريطة الحرفيّة).
  • الشرط إذا — إن وُجد — يسبق أنتج كالمعتاد:
متغير الزوجيّة = {لكل س في [1، 2، 3، 4] إذا س % 2 == 0 أنتج نص(س): س * 10}
اطبع_سطر(الزوجيّة)
{"2": 20, "4": 40}

فكّ الزوج: التكرار على الخرائط

🚧 القناة القادمة: هذه الميزة متوفّرة في القناة القادمة (/next/)؛ ستنتقل إلى المستقرّ مع الإصدار التالي.

يمكن أن يكون المصدر خريطةً لا مصفوفةً. عندئذٍ يمرّ الاستيعاب على مدخلات الخريطة. وله شكلان — بمتغيّر واحد (المفتاح فقط) أو بمتغيّرين (فكّ الزوج):

متغيّر واحد:   [ لكل <مفتاح> في <خريطة> أنتج <ناتج> ]
متغيّران:      [ لكل <مفتاح>، <قيمة> في <خريطة> أنتج <ناتج> ]

بمتغيّر واحد يُربَط الاسم بكلّ مفتاح (لا القيمة):

متغير المفاتيح = [لكل مفتاح في {"أ": 1} أنتج مفتاح]
اطبع_سطر(المفاتيح)
[أ]

المصفوفات تطبع عناصرها النصّيّة بلا علامتَي اقتباس ([أ])، بخلاف مفاتيح الخريطة المقتبسة ({"أ": …}).

الفاصلة ، تُدخِل متغيّر القيمة (فكّ الزوج): يُربَط الأوّل بالمفتاح والثاني بالقيمة — على منوال حلقة لكل حين تمرّ على خريطة:

متغير القيم = [لكل مفتاح، قيمة في {"س": 5} أنتج قيمة]
اطبع_سطر(القيم)
[5]

ويعمل فكّ الزوج في الأنواع الثلاثة. مثال يعيد بناء قاموس بقِيَم مضاعفة:

متغير المضاعف = {لكل مفتاح، قيمة في {"أ": 3} أنتج مفتاح: قيمة * 2}
اطبع_سطر(المضاعف["أ"])
6

والشرط إذا — إن وُجد — يستطيع الإشارة إلى متغيّر القيمة:

متغير الكبيرة = [لكل مفتاح، قيمة في {"أ": 2، "ب": 5} إذا قيمة > 3 أنتج قيمة]
اطبع_سطر(طول(الكبيرة))
1

ترتيب المدخلات غير محدَّد. كحلقة لكل على الخرائط، لا تضمن اللغة ترتيب المرور على المدخلات. لنتيجةٍ حتميّة استعمل خريطةً بمفتاحٍ واحد، أو عمليّةً لا تعتمد على الترتيب (كالجمع أو طول)، أو رتّب النتيجة صراحةً.


قاموس أم مجموعة؟ قاعدة التمييز

كلاهما داخل { }؛ الفارق وجود : بعد الناتج:

الصياغةالنوع
{لكل س في مصدر أنتج ناتج}مجموعة (ناتج مفرد)
{لكل س في مصدر أنتج مفتاح: قيمة}قاموس

أخطاء شائعة

  • الترتيب القديم مرفوض: [س * 2 لكل س في القائمة] (الناتج قبل لكل) لم يعد صالحًا؛ استعمل [لكل س في القائمة أنتج س * 2].
  • نسيان أنتج: [لكل س في القائمة] خطأ نحويّ؛ رأس الحلقة يتطلّب أنتج <ناتج>.
  • موضع الشرط: إذا يسبق أنتج دائمًا: [لكل س في م إذا شرط أنتج ناتج].
  • فاصلة فكّ الزوج بلا اسم: [لكل م، في خريطة أنتج م] خطأ نحويّ؛ الفاصلة تتطلّب اسم متغيّر القيمة بعدها: [لكل م، ق في خريطة أنتج م].

انظر أيضًا