Добавление в конец списка в LISP

Возможный дубликат:
что такое "минус" , чтобы добавить элемент в конец списка?

После просмотра многих руководств по lisp и поиска высокого и низкого уровня ответов Google, я до сих пор не могу понять, как добавить в конец списка в LISP.

Я хочу, чтобы моя функция добавила 'a в конец списка '(b c d), но я знаю только, как добавить ее спереди. Может ли кто-нибудь помочь мне правильно использовать cons, чтобы добавить 'a в конец списка? Вот мой код. Спасибо заранее.

(defun AddRt (a list)
  (cond
    ((null list)
      0)
    (t
      (princ (cons a (cons (car list) (cdr list))))
    )))


(AddRt 'a '(b c d))

Ответ 1

Либо push в last, или используйте nconc:

> (defparameter a (list 1 2 3))
A
> (push 4 (cdr (last a)))
(4)
> a
(1 2 3 4)
> (nconc a (list 5))
(1 2 3 4 5)
> a
(1 2 3 4 5)

Обратите внимание, что это destructive operator, т.е. они изменяют объект, который является значением a, а не только привязкой a.

Вот почему, BTW, вы никогда не должны использовать nconc в цитированных списках, например (nconc '(1 2 3) '(4 5 6)).

Ответ 2

Вы можете использовать рекурсивную функцию. Кроме того, вам следует избегать использования принца внутри.

Следующая функция, endcons, делает то же самое, что и минусы, за исключением того, что значение добавляется в конце.

(defun endcons (a v)
   (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))

(endcons 'a '(b c d))

Конечно, вы также можете использовать append:

(append '(b c d) '(a))

См. также этот связанный вопрос: что такое 'cons' для добавления элемента в конец списка?

Ответ 3

Один из способов - перевернуть список. Добавьте элемент в начало перевернутого списка. И затем, наконец, измените весь список.

Код схемы:

(define (add-to-tail l x)
   (reverse (cons x (reverse l)))

Но если это операция, которую вам нужно часто, то я предлагаю вам найти структуру данных, отличную от (односвязных) списков.