Comprender el modelo de evaluación ambiental

Ejercicio 3.20 en SICP:

Dibuje diagramas de entorno para ilustrar la evaluación de la secuencia de expresiones.

(define x (cons 1 2))
(define z (cons x x))


(set-car! (cdr z) 17)

(car x) 17

usando la implementación procesal de los pares dados anteriormente.

Mis ojos están destruidos, así que no puedo dibujar. En cambio, trataré de imaginar lo mejor que pueda cómo evoluciona el modelo de entorno.

Primero, aquí está la implementación de pares de procedimientos.

(define (cons x y)
  (define (set-x! v) (set! x v))
  (define (set-y! v) (set! y v))
  (define (dispatch m)
    (cond ((eq? m 'car) x)
          ((eq? m 'cdr) y)
          ((eq? m 'set-car!) set-x!)
          ((eq? m 'set-cdr!) set-y!)
          (else (error "Undefined 
                 operation: CONS" m))))
  dispatch)

(define (car z) (z 'car))
(define (cdr z) (z 'cdr))

(define (set-car! z new-value)
  ((z 'set-car!) new-value)
  z)

(define (set-cdr! z new-value)
  ((z 'set-cdr!) new-value)
  z)

Cada uno tiene un puntero al entorno global.

Aquí están las interacciones y mi solución tal como la imaginé.

(define x (cons 1 2))

aplicar contras
contras entorno creado llamado e1: el entorno global es el entorno que lo encierra
x obligado a 1
y obligado a 2
set-x !, set-y! y despachar cada uno tiene un puntero a e1
el despacho está vinculado al nombre x en el entorno global

(define z (cons x x))

aplicar contras
contras crear e2 - global está encerrando
x vinculado a x con respecto a global (compartido)
y unido a x con respecto a global (compartido)
set-x !, set-y! y despachar cada uno tiene un puntero a e2
el despacho está vinculado al nombre z en el entorno global

(set-car! (cdr z) 17)

aplicar set-car!
set-car! crea e3 - global está encerrando
z está vinculado a (cdr z) con respecto a global
aplicar cdr
cdr crea e4 - global está encerrando
z está unido a z con respecto a global
el despacho crea e5 - e2 está encerrando
m está obligado a 'cdr
devuelve x con respecto a e2.
x comparte x con respecto a global (así como x con respecto a e1)
volver a e3
nuevo valor está obligado a, 17
el despacho crea e6 - e2 está encerrando
m está obligado a 'set-car!
set-x! con respecto a e2 se devuelve
aplicar set-x!
set-x! crea e7 - e2 está encerrando
new-value está vinculado a 17
establecer x con respecto a e2 a 17
dado que x es e1, x en e2 yx en global comparten un objeto de procedimiento que tiene un puntero a e1, el carro del objeto de procedimiento cambia.

Espero que esto sea entendible. ¿Es correcta mi solución?

Respuestas a la pregunta(1)

Su respuesta a la pregunta