;; Using "lambda.rkt": ---------------------------------------- (interp (parse '{let {[x 1]} {+ x 2}}) mt-env) ... (interp (parse `1) mt-env) Result: (numV 1) ... (interp (parse '{+ x 2}) E1 = (extend-env 'x (numV 1) mt-env)) ... ... (interp (parse `x) E1) Result: (numV 1) ... ... (interp (parse `2) E1) Result: (numV 2) Result: (numV 3) Result: (numV 3) ;; Using "lambda.rkt": ---------------------------------------- (interp (parse '{{let {[x 1]} {lambda {y} x}} 5}) mt-env) (interp (parse '{let {[x 1]} {lambda {y} x}}) mt-env) ... ... (interp (parse `1) mt-env) Result: (numV 1) (interp (parse '{lambda {y} x}) (extend-evn 'x (numV 1) mt-env)) Result: c1 = (closV 'y (idC x) (extend-env 'x (numV 1) mt-env)) Result: c1 (interp (parse `5) mt-env) Result: (numV 5) (interp (idC x) (extend-env 'y (numV 5) (extend-env 'x (numV 1) mt-env))) Result: (numV 1) Result: (numV 1) ;; Using "store-with.rkt": ---------------------------------------- (interp (parse '{let {[x {box 5}]} {begin {set-box! x {lambda {y} x}} {{unbox x} 8}}}) mt-env mt-store) ... (interp (parse '{box 5}) mt-env mt-store) ... ... (interp (parse '5) mt-env mt-store) Result: (v*s (numV 5) mt-store) Result: (v*s (boxV 1) s1 = (override-store (cell 1 (numV 5)) mt-store)) (interp (parse '{begin {set-box! x {lambda {y} x}} {{unbox x} 8}}) e1 = (extend-env 'x (boxV 1) mt-env) s1) ... ... (interp (parse '{set-box! x {lambda {y} x}}) e1 s1) ... ... ... (interp (parse 'x) e1 s1) Result: (v*s (boxV 1) s1) (interp (parse '{lambda {y} x}) e1 s1) Result: (v*s v1 = (closV 'y 'x e1) s1) Result: (v*s v1 s2 = (override-store (cell 1 (closV 'y 'x e1)) s1)) ;; corrected; original was: ;; Result: (v*s (boxV 1) s2 = (override-store (cell 1 (closV 'y 'x e1)) s1)) ... ... (interp (parse '{{unbox x} 8}) e1 s2) ... ... ... (interp (parse '{unbox x}) e1 s2) ... ... ... ... (interp (parse 'x) e1 s2) Result: (v*s (boxV 1) s2) Result: (v*s (closV 'y 'x e1) s2) (interp (parse '8) e1 s2) Result: (v*s (numV 8) s2) (interp (parse 'x) e2 = (extend-env 'y (numV 8) e1) s2) Result: (v*s (boxV 1) s2) Result: (v*s (boxV 1) s2) Result: (v*s (boxV 1) s2) Result: (v*s (boxV 1) s2)