Зважаючи на те, що назва мови, яку ми використовуємо, Lisp, розшифровується як LIST Processing, можна припустити, що в цій мові є засоби для роботи зі списками елементів, і це справді так!
Хоча в Common Lisp є й інші структури даних, списки все одно використовуються дуже активно.
Список у Common Lisp - це послідовність елементів. Його також називають cons (переважно з історичних причин).
Самі елементи не обовʼязково мають бути одного типу.
Наприклад, можна мати список із 1, two, "III".
Можна просто набрати цитований список ось так: '(1 two "III"), і це приведе до створення та обчислення списку (він обчислюється в (1 two "III")).
Є також дві основні функції для створення списків: list і cons.
list приймає нуль або більше аргументів і обчислюється в список, створений із цих значень:
(list 1 'two "III") ; => (1 two "III")
cons приймає два елементи і створює список, у якому перший елемент стає його car (головою списку), а другий - його cdr (решта списку):
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
Функції car і cdr можна використовувати, щоб отримати car і cdr списку.
(first і rest - синоніми car і cdr і працюють точно так само.)
Довжину списку можна визначити за допомогою length.
Порожній список має довжину нуль.
Довільний елемент можна отримати за допомогою nth (зауважмо: списки індексуються з нуля).
Запитати індекс, більший за довжину списку, не є помилкою.
Натомість він обчислюється в nil:
(nth 23 '(short list)) ; => nil
Є також кілька допоміжних функцій для доступу до перших елементів списку: first, second, third і так далі аж до tenth. Зручно, правда?
Два або більше списків можна обʼєднати за допомогою append:
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Кожен аргумент, переданий append, має бути списком.
Леслі, іншопланетянин з Lisp, має зробити покупки. Дуже важливо мати список покупок. До нього треба додавати речі й вилучати їх.
Звісно, звичайні ручка й папір не годяться для іншопланетянина з Lisp. Слово «List» - це ж майже все слово «Lisp»! Тож треба написати кілька функцій, які допоможуть стежити за покупками.
Допоможемо Леслі стежити за списком покупок?
Перш за все Леслі треба створити порожній список. Ідеально підійде функція new-list.
(new-list) ; => ()
Ой ні... Леслі вже має на думці кілька речей, тож потрібна функція, яка приймає три елементи (на щастя, Леслі створює списки лише з трьох елементів. Ні більше, ні менше!) і створює з них новий список покупок. Напишіть функцію list-of-things, яка приймає три елементи й повертає список із них.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Перш ніж іти до магазину, Леслі зазирає до комори, щоб подивитися, чого бракує. Допоможіть Леслі, написавши функцію add-to-list, яка додає елемент на початок списку.
(add-to-list 'butter '(bread)) ; => '(butter bread)
Під час покупок Леслі хоче знати, що шукати далі. А ще любить зазирати наперед у список, щоб побачити другий, третій чи навіть двадцять третій елемент (його щасливе число).
first-thing повертає перший елемент спискуsecond-thing повертає другий елементthird-thing повертає третій елементtwenty-third-thing повертає двадцять третій елемент(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Леслі хоче знайти перший елемент списку й забрати його з полиці. Допоможіть Леслі, написавши функцію remove-first-item, яка повертає список з усім, крім першого елемента вхідного списку.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Леслі зрозумів, що випадково склав два списки покупок замість одного! Напишіть функцію list-append, яка повертає список з елементів першого списку, за якими йдуть елементи другого списку.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Леслі починає хвилюватися, що цей похід за покупками забере чимало часу. То скільки ж речей у цьому списку? Напишіть функцію just-how-long, яка поверне довжину списку.
(just-how-long '(bread milk butter salt)) ; => 4
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.