منظور از «نگاشت» اعمال یک تابع روی هر عنصر از یک دنباله برای ساختن دنبالهای تازه است.
از 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 در بالا) برای اثرهای جانبی به کار میرود.