Доступ к элементам списков
- Функция: car cons-cell
-
Эта функция возвращает значение, на которое ссылается первый слот cons-ячейки cons-cell. Иными словами, она возвращает CAR ячейки cons-cell.
В особом случае, если cons-cell —
nil, эта функция возвращаетnil. Поэтому в качестве аргумента допустим любой список. Если аргумент не является cons-ячейкой илиnil, генерируется ошибка.(car '(a b c)) ⇒ a(car '()) ⇒ nil
- Функция: cdr cons-cell
-
Эта функция возвращает значение, на которое ссылается второй слот cons-ячейки cons-cell. Иными словами, она возвращает CDR ячейки cons-cell.
В особом случае, если cons-cell —
nil, эта функция возвращаетnil; поэтому в качестве аргумента допустим любой список. Если аргумент не является cons-ячейкой илиnil, генерируется ошибка.(cdr '(a b c)) ⇒ (b c)(cdr '()) ⇒ nil
- Функция: car-safe object
-
Эта функция позволяет получить CAR cons-ячейки, избегая ошибок для других типов данных. Она возвращает CAR объекта object, если object является cons-ячейкой, а в противном случае —
nil. Это отличается отcar, которая генерирует ошибку, если object не является списком.(car-safe object) ≡ (let ((x object)) (if (consp x) (car x) nil))
- Функция: cdr-safe object
-
Эта функция позволяет получить CDR cons-ячейки, избегая ошибок для других типов данных. Она возвращает CDR объекта object, если object является cons-ячейкой, а в противном случае —
nil. Это отличается отcdr, которая генерирует ошибку, если object не является списком.(cdr-safe object) ≡ (let ((x object)) (if (consp x) (cdr x) nil))
- Макрос: pop listname
-
Этот макрос позволяет удобно одновременно проверить CAR списка и удалить его из списка. Он работает со списком, хранящимся в listname. Макрос удаляет первый элемент списка, сохраняет CDR в listname, а затем возвращает удалённый элемент.
В простейшем случае listname — это не заключённый в кавычки символ, обозначающий список; в таком случае этот макрос эквивалентен
(prog1 (car listname) (setq listname (cdr listname))).x ⇒ (a b c) (pop x) ⇒ a x ⇒ (b c)В более общем случае listname может быть обобщённой переменной. В этом случае макрос сохраняет значение в listname с помощью
setf. См. Обобщённые переменные.О макросе
push, который добавляет элемент в список, см. Изменение переменных-списков.
- Функция: nth n list
-
Эта функция возвращает n-й элемент списка list. Нумерация элементов начинается с нуля, поэтому CAR списка list — это элемент номер ноль. Если длина списка list не превышает n, возвращаемое значение —
nil.(nth 2 '(1 2 3 4)) ⇒ 3(nth 10 '(1 2 3 4)) ⇒ nil (nth n x) ≡ (car (nthcdr n x))Функция
eltпохожа, но работает с последовательностями любого типа. По историческим причинам её аргументы указываются в обратном порядке. См. Последовательности.
- Функция: nthcdr n list
-
Эта функция возвращает n-й CDR списка list. Иными словами, она пропускает первые n звеньев списка list и возвращает остаток.
Если n равно нулю,
nthcdrвозвращает весь список list. Если длина списка list не превышает n,nthcdrвозвращаетnil.Псевдоним
nthcdr—drop.(nthcdr 1 '(1 2 3 4)) ⇒ (2 3 4)(nthcdr 10 '(1 2 3 4)) ⇒ nil(nthcdr 0 '(1 2 3 4)) ⇒ (1 2 3 4)
- Функция: take n list
-
Эта функция возвращает первые n элементов списка list. По сути, она возвращает ту часть списка list, которую пропускает
nthcdr.takeвозвращает list, если в нём меньше n элементов; если n равно нулю или отрицательно, она возвращаетnil.В общем случае
(append (take n list) (drop n list))вернёт список, равный list.(take 3 '(a b c d)) ⇒ (a b c)(take 10 '(a b c d)) ⇒ (a b c d)(take 0 '(a b c d)) ⇒ nil
- Функция: ntake n list
-
Это вариант функции
take, который работает, разрушительно изменяя структуру списка-аргумента. Это делает его быстрее, но исходное значение list может быть утрачено.ntakeвозвращает list без изменений, если в нём меньше n элементов; если n равно нулю или отрицательно, она возвращаетnil. В противном случае она возвращает list, усечённый до первых n элементов.Поэтому обычно рекомендуется использовать возвращаемое значение, а не полагаться только на эффект усечения, если только не известно, что n положительно.
- Функция: drop-while pred list
-
Эта функция пропускает начальные элементы списка, для которых предикат pred возвращает не-
nil, и возвращает остаток.(drop-while #'numberp '(1 2 a b 3 4)) ⇒ (a b 3 4)
- Функция: take-while pred list
-
Эта функция возвращает начальные элементы списка, для которых предикат pred возвращает не-
nil, а остальные игнорирует.В общем случае
(append (take-while p list) (drop-while p list))вернёт список, равный list.(take-while #'numberp '(1 2 a b 3 4)) ⇒ (1 2)
- Функция: all pred list
-
Эта функция возвращает
t, если pred истинен для всех элементов списка list.(all #'numberp '(1 2 3 4)) ⇒ t (all #'numberp '(1 2 a b 3 4)) ⇒ nil (all #'numberp '()) ⇒ t
- Функция: member-if pred list
-
Эта функция возвращает не-
nil, если pred истинен хотя бы для одного элемента списка list. Возвращаемое значение — самый длинный суффикс списка list, первый элемент которого удовлетворяет pred.(member-if #'symbolp '(1 2 3 4)) ⇒ nil (member-if #'symbolp '(1 2 a b 3 4)) ⇒ (a b 3 4) (member-if #'symbolp '()) ⇒ nil
- Функция: any pred list
Эта функция является псевдонимом
member-if. Её может быть удобнее использовать в контекстах, где важно только, равно ли возвращаемое значение nil, а само значение не используется.
- Функция: last list &optional n
Эта функция возвращает последнее звено списка list.
carэтого звена является последним элементом списка. Если list пуст, возвращаетсяnil. Если n не равноnil, вместо этого возвращается звено, отстоящие на n позиций от конца, либо весь список list, если n больше длины list.
- Функция: safe-length list
-
Эта функция возвращает длину списка list, не рискуя вызвать ошибку или зациклиться. Обычно она возвращает число различных cons-ячеек в списке. Однако для циклических списков это значение является лишь верхней границей и часто оказывается завышенным.
Если list не является
nilили cons-ячейкой,safe-lengthвозвращает 0.
Чаще всего длину списка вычисляют с помощью length, если не опасаются, что список может быть циклическим. См. Последовательности.
- Функция: caar cons-cell
Это то же самое, что
(car (car cons-cell)).
- Функция: cadr cons-cell
Это то же самое, что
(car (cdr cons-cell))или(nth 1 cons-cell).
- Функция: cdar cons-cell
Это то же самое, что
(cdr (car cons-cell)).
- Функция: cddr cons-cell
Это то же самое, что
(cdr (cdr cons-cell))или(nthcdr 2 cons-cell).
Кроме перечисленных выше, определены ещё 24 композиции car и cdr в виде cxxxr и cxxxxr, где каждый x — это либо a, либо d. cadr, caddr и cadddr выбирают соответственно второй, третий или четвёртый элемент списка. cl-lib предоставляет те же функции под именами cl-second, cl-third и cl-fourth. См. Функции для работы со списками в Расширениях Common Lisp.
- Функция: butlast x &optional n
Эта функция возвращает список x без последнего элемента или последних n элементов. Если n больше нуля, она создаёт копию списка, чтобы не изменять исходный список. В общем случае
(append (butlast x n) (last x n))вернёт список, равный x.
- Функция: nbutlast x &optional n
Это вариант функции
butlast, который работает, разрушительно изменяяcdrсоответствующего элемента, а не создавая копию списка.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/List-Elements.html