Відображення - це застосування функції до кожного елемента послідовності, унаслідок чого утворюється нова послідовність.
Це легко зробити з масивом за допомогою функції mapcar.
Припустімо, що в нас є функція double, яка множить свій аргумент на 2:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Зауважмо, що перший аргумент - це функція, яку потрібно викликати. #' - це спеціальний синтаксис цитування, який указує на функцію.
Спочатку double викликали з першим елементом, потім з другим і так далі.
Результати зібрали в масив, який і є значенням цього виразу.
Фільтрування - це процес створення послідовності з іншої послідовності шляхом копіювання всіх елементів початкової послідовності, крім деяких. Вибір того, які елементи включити до нової послідовності, можна зробити за допомогою функції-предиката, тобто функції, яка дає булеве значення (англ. Boolean), або за допомогою перевірки на рівність із конкретним обʼєктом.
remove-if - це функція, яка приймає функцію-предикат і послідовність як аргументи та повертає послідовність лише з тих елементів, для яких предикат дав неправду.
Інакше кажучи, вона «видаляє» всі елементи послідовності, для яких предикат дав правду. Однак зауважмо, що ця функція не змінює початкову послідовність!
Натомість вона повертає нову послідовність без відповідних елементів. Якщо предикат дав правду для всіх значень, то повертається порожня послідовність.
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
Якщо потрібно видалити конкретний елемент із послідовності, можна скористатися функцією remove, яка приймає елемент для видалення та послідовність.
Повертаються всі значення з послідовності, які не дорівнюють елементу для видалення.
ПРИМІТКА: рівність типово перевіряється за допомогою eql загального предиката рівності.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
Люсі, інопланетянка з Lisp, любить числа, вона вважає деякі з них «чудовими».
Вона просить нас допомогти їй написати функції, щоб зробити числа ще чудовішими.
Те, що, на думку Люсі, робить число чудовим, може змінюватися, тож функції мають бути гнучкими.
Щоб перетворити список чисел на список більш чудових чисел, напишіть функцію make-magnificent-maybe, яка приймає функцію для застосування до чисел і список чисел.
Вона має обчислюватися в список чисел, які є більш чудовими (відповідно до наданої функції).
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
Після того як (сподіваємося) числа стали більш чудовими, Люсі хоче побачити лише ті числа, які справді чудові.
Вона точно знає, що 1 ніколи не буває чудовим, тож це потрібно просто прибрати.
Але крім цього, Люсі іноді змінює свою думку, тож вона знову дасть нам функцію, яка скаже, чудове число чи ні.
Напишіть функцію only-the-best, яка приймає функцію та список чисел і повертає лише найкращі числа (не 1 і не числа, для яких функція дає правду).
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.