Сп

Списки у Common Lisp

15 вправ

Про концепцію Списки

Списки - дуже поширений тип даних у Common Lisp. Вони складаються з послідовності cons-комірок. Кожен car - елемент списку, а кожен cdr - або наступна cons-комірка, або завершальний атом.

Список, який закінчується порожнім списком, називають «правильним списком».

Список, який закінчується атомом, що не є порожнім списком, називають «точковим списком» (за тим, як він друкується: (cons 'a 'b) ;=> (a . b)).

Список також може бути циклічним, якщо якась cons-комірка у списку є cdr пізнішої cons-комірки. Наприклад: (let ((x (list 1))) (setf (cdr x) x) (write x :stream t :circle t) :done). Будьмо обережні, працюючи з циклічними списками: якщо дозволити їх надрукувати, не звʼязавши *print-circle* з t, це спричинить нескінченний цикл і заблокує REPL (у цьому прикладі, якщо вказати :circle t для write, *print-circle буде звʼязано з t).

Поєднання списків

append можна викликати з будь-якою кількістю списків, зокрема з одним чи з нулем:

(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()))     ; => (A B C)
(append '(a b c))          ; => (A B C)
(append)                   ; => ()

Замість append можна використати nconc, який дає той самий результат, але має побічний ефект: він змінює списки. Будьмо обережні з nconc, бо він може мати несподівані наслідки.

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

Вивчити концепцію Списки

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

Розблокуйте ще 5 вправ, щоб практикувати концепцію Списки