После выполнения первых двух вызовов defvar
у вас есть следующие переменные назначения для conses.
A => +---+---+ +---+---+ +---+---+
+--> | 1 | ---->| 2 ---->| 3 | ----> NIL
\ +---+---+ +---+---+ +---+---+
\ --^
\ /
\ /
\ /
\ /
B => +-\-+-|-+
| | | | |
+---+---+
В печатном представлении это выглядит следующим образом:
A => (1 2 3)
B => ((1 2 3) 2 3)
При выполнении rplacd
, он изменяет cdr
из a
сослаться на новый cons
. Но cdr
b
по-прежнему относится к тому же cons
, как и раньше.
+---+---+
->| 5 | ----> NIL
/+---+---+
/
A => +---+-|-+ +---+---+ +---+---+
+--> | 1 | | | | 2 ---->| 3 | ----> NIL
\ +---+---+ +---+---+ +---+---+
\ --^
\ /
\ /
\ /
\ /
B => +-\-+-|-+
| | | | |
+---+---+
В печатной форме это выглядит следующим образом:
A => (1 5)
B => ((1 5) 2 3)
Важно, чтобы понять о Лиспе заданий является то, что они не делают копии структуры списка, они просто присвоить ссылки на conses (если вы знакомы с такими языками, как C, это все как указатель на struct
).
Это не то, что я получаю, когда пытаюсь. 'a' is' (1 5) ',' b' is '((1 5) 2 3)'. – Barmar
BTW, Lisp обычно не считается функциональным языком. – Barmar
@ Бармар, вы правы. Я исправляю это. – user4249446