SICP 全笔记

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)