نگ

نگاشت در 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 تخت می‌شود؛ 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 تمرین دیگر را باز کنید