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
|#