Code Review

Compare your solutions

    #|
  Упражнение 3.20

  Нарисуйте диаграммы окружений, изображающие выполнение последовательности выражений

    (define x (cons 1 2))
    (define z (cons x x))
    (set-car! (cdr z) 17)
    (car x)
    17

  с помощью вышеприведенной процедурной реализации пар. (Сравните с упражнением 3.11.)
|#

#|
    ┌► параметры: x y                     ┌► параметры: z
    │  тело:                              │  тело: (z 'car)
    │  (define (set-x! v) (set! x v))     │
    │  (define (set-y! v) (set! y v))     │┌► параметры: z
    │  (define (dispatch m)               ││  тело: (z 'cdr)
    │    (cond ((eq? m ’car) x)           ││
    │          ((eq? m ’cdr) y)           ││┌► параметры: z new-value    ┌► параметры: z new-value
    │          ((eq? m ’set-car!) set-x!) │││  тело:                     │  тело:
    │          ((eq? m ’set-cdr!) set-y!) │││  ((z ’set-car!) new-value) │  ((z ’set-cdr!) new-value)
    │          (else (error "..." m))))   │││  z                         │  z
    │  dispatch                           ││└─────────────┐              │
    └─────────────────┐           ┌───────┘└──┐           │           ┌──┘
                    ┏━┿━┳━━━┓   ┏━┿━┳━━━┓   ┏━┿━┳━━━┓   ┏━┿━┳━━━┓   ┏━┿━┳━━━┓
                    ┃ • ┃ • ╂─┐ ┃ • ┃ • ╂─┐ ┃ • ┃ • ╂─┐ ┃ • ┃ • ╂─┐ ┃ • ┃ • ╂─┐
                    ┗━━━┻━━━┛ │ ┗━━━┻━━━┛ │ ┗━━━┻━━━┛ │ ┗━━━┻━━━┛ │ ┗━━━┻━━━┛ │
                        ▲     ▼     ▲     ▼     ▲     ▼     ▲     ▼     ▲     ▼
                ┏━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━━━━┿━━━━━━━━┓
     Глобальное ┃ cons ─┘      car ─┘      сdr ─┘ set-car! ─┘ set-cdr! ─┘        ┃
    ───────────►┃ ...                                                            ┃◄─┐
      окружение ┃   x                                                        z   ┃  │
              ┌►┗━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━┛  │
              │     │                                                        │      │
              │   ┌─│──► параметры: m                      ┌─► параметры: v  │      │
              │   │ │    тело:                             │   тело:         │      │
              │   │ │    (cond ((eq? m ’car) x)            │   (set! x v)    │      │
              │   │ │          ((eq? m ’cdr) y)            │                 │      │
              │   │ │          ((eq? m ’set-car!) set-x!)  │┌► параметры: v  │      │
              │   │ │          ((eq? m ’set-car!) set-x!)  ││  тело:         │      │
              │   │ │          (else (error "..." m)))     ││  (set! y v)    │      │
              │   │ │        ┌──────────────────────────┬──┘│                │      │
              │   │ │        │             ┌────────────│───┴─────────┐      │      │
              │   │ │        │             │            │             │      │      │
              │   │ │      ┏━┿━┳━━━┓     ┏━┿━┳━━━┓    ┏━┿━┳━━━┓     ┏━┿━┳━━━┓│      │
              │   │ │      ┃ • ┃ • ┃◄┐ ┌►┃ • ┃ • ┃    ┃ • ┃ • ┃◄┐ ┌►┃ • ┃ • ┃│      │
              │   │ │      ┗━━━┻━┿━┛ │ │ ┗━━━┻━┿━┛    ┗━━━┻━┿━┛ │ │ ┗━━━┻━┿━┛│      │
              ├◄──│─│────────┐   ├───│─│───────┘            ├───│─│───────┘  │      │
              │   ├─│────────│───│───│─│────────────────────│───│─│────────┐ │      │
              │   │ ▼        │   ▼   │ │                    ▼   │ │┌───────│─▼─────►┘
              │ ┏━┿━┳━━━┓  ┏━┷━━━━━━━┿━┿━┓            ┏━━━━━━━━━┿━┿┷┓    ┏━┿━┳━━━┓
              │ ┃ • ┃ • ╂─►┃ x: 1    │ │ ┃          ┌─╂ x       │ │ ┃    ┃ • ┃ • ╂┐
              │ ┗━━━┻━━━┛  ┃ y: 2    │ │ ┃          │┌╂ y       │ │ ┃    ┗━━━┻━━━┛│
              │  ▲▲▲▲ E1 ─►┃ set-x! ─┘ │ ┃          ││┃ set-x! ─┘ │ ┃◄─ E2  ▲▲▲   │
              │  ││││      ┃ set-y! ───┘ ┃          ││┃ set-y! ───┘ ┃◄──────│││───┘
              │  │││└──────╂ dispatch    ┃          ││┃ dispatch ───╂───────┘││
              │  │││       ┗━━━━━━━━━━━━━┛          ││┗━━━━━━━━━━━━━┛        ││
              │  ││└───────────▲────────────────────┘│        ▲              ││
              │  │└────────────│─────────────────────┘      ┌─│──────────────┘│
              │  └─────────────│┐                           │ │       ┌───────┘
              │                ││     ┏━━━━━━━━━━━━━━━━━━━┓ │ │   ┏━━━┿━━━━━┓
              │                ││E3 ─►┃ z ────────────────╂─┘ │   ┃ z ┘     ┃◄─ E4
              ├◄───────────────││─────┨ new-value: 17     ┃   │   ┗┯━━━━━━━━┛
              │                ││     ┗━━━━━━━━━━━━━━━━━━━┛   │    │(cdr z)
              │                ││     (set-car! (cdr z) 17)   │    │
              ├◄───────────────││─────────────────────────────│────┘
              │┏━━━━━━━━━━━━━━┓││     ┏━━━━━━━━━┓             │
          E6 ─►┃ m: 'set-car! ┠┤│E5 ─►┃ m: 'cdr ┠─────────────┘
              │┗━━━━━━━━━━━━━━┛││     ┗━━━━━━━━━┛
              │ (x 'set-car!)  ││   (dispatch 'cdr)
              │                ││
              │┏━━━━━━━━━━━━━━┓││      ╔═══════════╗
          E7 ─►┃ v: 17        ┠┤│E1* ─►║ x: 17     ║
              │┗━━━━━━━━━━━━━━┛││      ║ ...       ║
              │  (set-x! 17)   ││      ╚═══════════╝
              └◄─┐             └│───────┐
               ┏━┷━━━━━━━┓      │     ┏━┷━━━━━━━┓
          E8 ─►┃ z ──────╂──────┘E9 ─►┃ m: 'car ┃
               ┗━━━━━━━━━┛            ┗━━━━━━━━━┛
                 (car x)               (x 'car) ═► 17
|#