Spec-Zone.ru › Elisp

Доступ к элементам списков

Функция: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API