الاختزال هو التطبيق المتكرر لدالة على كل عنصر من عناصر متتالية ما، مع تجميع النتائج بطريقة ما. الدالة المطبَّقة تأخذ معاملين: القيمة المجمَّعة الحالية، والعنصر المراد معالجته. ويجب أن تكون نتيجتها هي القيمة المجمَّعة الجديدة.
في Common Lisp تُنجَز هذه العملية بالدالة reduce.
وفي أبسط صورها تبدو هكذا:
(reduce #'function-to-apply sequence :initial-value value)
لاحظ أن هناك قيمة ابتدائية مُعطاة، وهي "القيمة المجمَّعة الحالية" التي تُمرَّر إلى الدالة عند معالجة العنصر الأول.
إليك مثالًا يجمع أعداد المصفوفة معًا بدءًا من قيمة ابتدائية مقدارها 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
لاحظ أنه إذا كانت المتتالية فارغة فلن تُستدعى الدالة أبدًا، وستكون نتيجة الصيغة هي القيمة الابتدائية.
لوجان، الكائن الفضائي الخاص بـ Lisp، يحب الأعداد ويحب أيضًا التنظيم.
يطلب منك مساعدته في كتابة دالة تأخذ مصفوفة أعداد وتنتج زوجًا من مصفوفتين: الأولى هي كل الأعداد الفردية، والثانية هي كل الأعداد الزوجية.
أولًا، ستحتاج إلى إنشاء دالة تأخذ زوجًا من مصفوفتين وعددًا، وتضع ذلك العدد في المصفوفة الفرعية الصحيحة حسب ما إذا كان فرديًا أم زوجيًا:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
الآن، باستخدام الدالة التي أنشأتها للتو، يمكنك كتابة دالة أخرى تأخذ مصفوفة أعداد وتصنّفها كما فعلت أعلاه:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
سجّل في Exercism لتتعلّم وتتقن Common Lisp عبر 27 مفهومًا92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.