Треки
/
Common Lisp
Common Lisp
/
Салабус
/
Відображення
Ві

Відображення у 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 приймає 3 або більше аргументів:

  • перший - це тип результуючої послідовності
  • другий - це функція, яку треба застосувати
  • третій і всі наступні - це послідовності, над якими виконується операція.
(map 'list #'double '(1 2 3))        ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"

В окремому випадку, якщо як тип результуючої послідовності передати nil, то повертається nil. Це (як і mapc та mapl вище) використовують для побічних ефектів.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Відображення

Практика заблокована

Розблокуйте ще 8 вправ, щоб практикувати концепцію Відображення