Список представляет собой цепочку пар.Элементы - это машины каждой пары, cdr - это ссылка на следующую пару в цепочке, или пустой список для последней пары в цепочке.
Когда вы используете (cons 'a '(b c))
, вы создаете новуюпара перед существующим списком (b c)
, поэтому результатом по-прежнему является список.
Но когда вы используете (cons '(b c) 'a)
, вы создаете пару, чей cdr является символом a
, а несписок.И последняя пара в списке (b c)
все еще имеет свой cdr, указывающий на пустой список.
Вам необходимо скопировать первый список, и когда вы доберетесь до конца, вы должны сделать так, чтобы cdr указывал насписок, содержащий a
.Вы можете сделать это с помощью рекурсивной процедуры.
(define (list-append old-list new-el)
(if (null? old-list)
(list new-el)
(cons (car old-list)
(list-append (cdr old-list) new-el))))
(list-append '(b c) 'a)
Логика:
- Если мы попытаемся добавить пустой список, просто вернем список, содержащий новый элемент
- В противном случае добавьте новый элемент в конец исходного списка с помощью рекурсивного вызова, а затем поместите первый элемент перед ним (используя метод
(cons new-element old-list)
, который вы показали в первом примере).