Append lisp как работает
Перейти к содержимому

Append lisp как работает

Append lisp как работает

Следующие функции выполняет различные операции над списками.

Список является одним из первых Lisp’овых типов данных. Имя «Lisp» расшифровывается как «LISt Processing».

[Функция] endp object

Предикат endp используется для проверки конца списка. Возвращает ложь для cons-ячеек, истину для nil, и генерирует ошибку для всех остальных объектов других типов. _______________________________________

Заметка для реализации: Implementations are encouraged to signal an error, especially in the interpreter, for a non-list argument. The endp function is defined so as to allow compiled code to perform simply an atom check or a null check if speed is more important than safety.

[Функция] list-length list

list-length возвращает длину списка list. list-length отличается от length при использовании с циклическим списком. В таком случае length может не вернуть управление, тогда как list-length вернёт nil. Например:

list-length может быть реализован так:

Смотрите length, которая возвращает длину любой последовательности.

[Функция] nth n list

(nth n list) возвращает n-нный элемент списка list. car элемент списка принимается за «нулевой» элемент. Аргумент n должен быть неотрицательным целым числом. Если длина списка не больше чем n, тогда результат (), или другими словами nil. (Это согласовывается с концепцией того, что car и cdr от () являются ().) Например:

nth может быть использован в связке с setf для изменения элемента списка. В этом случае, аргумент n должен быть меньше чем длина списка list.

Следует отметить, что порядок аргументов в nth обратный в отличие от большинства других функций селекторов для последовательностей, таких ка elt.

[Функция] first list
[Функция] second list
[Функция] third list
[Функция] fourth list
[Функция] fifth list
[Функция] sixth list
[Функция] seventh list
[Функция] eighth list
[Функция] ninth list
[Функция] tenth list

Иногда эти функции удобно использовать для доступа к определёнными элементам списка. first то же, что и car, second то же, что и cadr, third то же, что и caddr, и так далее. Следует отметить, что нумерация начинается с единицы (first) в отличие от нумерации, которая начинается с нуля и используется в nth.

Каждая из этих функций может быть использована в связке setf для изменения элемента массива.

[Функция] rest list

rest означает то же, что и cdr, но мнемонически согласуется с first. rest может использоваться в связке с setf для изменения элементов массива.

[Функция] nthcdr n list

(nthcdr n list) выполняет для списка lisp операцию cdr n раз, и возвращает результат. Например:

Другими словами, она возвращает n-нную cdr часть списка.

Аргумент n должен быть неотрицательным целым числом.

[Функция] last list &optional (n 1)

last возвращает последние n cons-ячеек списка lisp. Список list может быть списком с точкой. Передача зацикленного списка является ошибкой.

Аргумент n должен быть неотрицательным целым числом. Если n равен нулю, тогда возвращается последний атом списка list. Если n не меньше чем количество cons-ячеек, то возвращается весь список.

list создаёт и возвращает список, составленный из аргументов. Например:

Append lisp как работает

append &rest lists => result

Arguments and Values:

list —each must be a proper list except the last, which may be any object .

result —an object . This will be a list unless the last list was not a list and all preceding lists were null .

append returns a new list that is the concatenation of the copies. lists are left unchanged; the list structure of each of lists except the last is copied. The last argument is not copied; it becomes the cdr of the final dotted pair of the concatenation of the preceding lists , or is returned directly if there are no preceding non-empty lists .

Affected By: None.

Exceptional Situations: None.

The following X3J13 cleanup issue, not part of the specification , applies to this section:

Adding to the end of list in LISP [duplicate]

After watching many tutorials on lisp and searching high and low on google for answers, I still cannot figure out how to add to the end of a list in LISP.

I want my function to add ‘a at the end of the list ‘(b c d) but I only know how to add it in front. Can someone help me use cons correctly to add ‘a at the end of the list? Here is my code. Thanks in advance.

user avatar

3 Answers 3

Either push to last , or use nconc :

note that these are destructive operators, i.e., they modify the object which is the value of a , not just the binding of a .

This is why, BTW, you should never use nconc on quoted lists, like (nconc ‘(1 2 3) ‘(4 5 6)) .

PS. Note that adding to the end of a list requires its full traversal and is thus an O(length(list)) operation. This may be a bad idea if your lists are long, so people often use the push / nreverse idiom, e.g.,

user avatar

You may use a recursive function. Also, you should avoid using princ inside.

The following function, endcons, does exactly the same thing as cons, except the value is added at the end.

Of course, you could also use append:

One way is to reverse the list. Add the element to beginning of the reversed list. And then finally reverse the whole list.

But if this is an operation you need often, then I’d suggest you find a data structure other than (single linked) lists.

Добавить комментарий

Ваш адрес email не будет опубликован.