Exercise 3.15. Draw box-and-pointer diagrams to explain the effect of set-to-wow! on the structures z1 and z2 above.
set-to-wow! 过程为
(define (set-to-wow! x)
(set-car! (car x) 'wow)
x)
z1 与 z2 虽然都是 ((a b) a b),但两个的结构并不一样。对 z1 来说,把 car 的 car 设置成 ‘wow 就会把 x 的 car 设置成 wow,导致了最终链表所有用到 a 的地方都变了。
z1 +---+---+ z1 +---+---+
------>| | | ------>| | |
+-+-+-+-+ +-+-+-+-+
| | | |
| | | |
v v v v
x +---+---+ +---+---+ x +---+---+ +---+---+
------>| | +--->| | / | =======> ------>| | +--->| | / |
+-+-+---+ +-+-+---+ +-+-+---+ +-+-+---+
| | | |
| | (set-to-wow! z1) | |
v v v v
+---+ +---+ +---+ +---+
| a | | b | |wow| | b |
+---+ +---+ +---+ +---+
对于 z2 来说,就只改变了一个 pair 的 car 而已:
z2 +---+---+ +---+---+ +---+---+
------>| | +---->| | +---->| | / |
+-+-+---+ +-+-+---+ +-+-+---+
| | |
| | |
| v v
| +---+ +---+
| | a | | b |
| +---+ +---+
| ^ ^
| | |
| | |
| +-+-+---+ +-+-+---+
+-----------| | +---->| | / |
+---+---+ +---+---+
将变为:
z2 +---+
| |wow|
| +---+
| ^
| |
| |
| +---+---+ +-+-+---+ +---+---+
+------>| | +---->| | +---->| | / |
+-+-+---+ +---+---+ +-+-+---+
| |
| |
| v
| +---+ +---+
| | a | | b |
| +---+ +---+
| ^ ^
| | |
| | |
| +-+-+---+ +-+-+---+
+-----------| | +---->| | / |
+---+---+ +---+---+
所以 z2 是 ((wow b) a b)