ال

التعيين في Common Lisp

12 تمرينًا

نبذة عن التعيين

يشير التخطيط إلى تطبيق دالة على كل عنصر من عناصر متتالية لإنتاج متتالية جديدة.

يمكن استخدام mapcar لتخطيط دالة على مصفوفة من الكائنات

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

لاحظ أن الوسيط الأول هو دالة يجب استدعاؤها. إنّ #' صيغة اقتباس خاصة لتحديد دالة. (يمكن استخدام 'double هنا، لكن استعمال #' هو الأسلوب المألوف وربما «الأصح».)

أكثر من مصفوفة

لا يقتصر التخطيط على تطبيق دالة على متتالية واحدة، بل يمكن تنفيذه على عدة متتاليات. إذا قُدّمت N من المتتاليات، فعلى الدالة أن تأخذ N من الوسائط.

(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))

دوال تخطيط أخرى

إضافة إلى mapcar، هناك دوال أخرى للتخطيط على المصفوفات. mapcar هي الأكثر شيوعًا بلا شك، لكن من الجيد معرفة الدوال الأخرى.

تعمل maplist بطريقة مشابهة لـ mapcar، لكنها تعمل على مصفوفات فرعية متتالية بدلًا من العناصر. أولًا على المصفوفة كاملة، ثم على cdr، ثم على cdr الناتجة، وهكذا:

(maplist #'identity '(a b c)) ; => ((A B C) (B C) (C))

تشبه mapc وmapl كلًّا من mapcar وmaplist على الترتيب، لكنهما لا تجمعان النتائج، بل تُرجعان المصفوفة الأولى. يُستخدم هذا في العمليات ذات الآثار الجانبية.

تشبه mapcan وmapcon كلًّا من mapcar وmaplist، لكن النتيجة تُسطَّح باستخدام nconc، الذي يشبه append لكنه مدمِّر لكل وسائطه عدا الأخير.

التخطيط على متتاليات أخرى

لا يقتصر التخطيط على المصفوفات. يمكن التخطيط على أي متتالية (نُوقشت في مفهوم آخر). وفي حالة المتتاليات غير المصفوفية تُستخدم الدالة map.

تأخذ map ثلاثة وسائط أو أكثر:

  • الأول هو نوع المتتالية الناتجة
  • الثاني هو الدالة المطلوب تطبيقها
  • الثالث والوسائط الباقية هي المتتاليات المطلوب العمل عليها.
(map 'list #'double '(1 2 3))        ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"

وفي حالة خاصة، إذا قُدِّم nil كنوع المتتالية الناتجة، فإن الدالة تُرجع nil. ويُستخدم هذا (مثل mapc وmapl أعلاه) من أجل الآثار الجانبية.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم التعيين

التدريب مقفل

افتح 8 تمارين إضافية لممارسة التعيين