#lang racket (interp (parse '{+ 1 2}) mt-env) ... (interp (parse '1) mt-env) ... = (numV 1) ... (interp (parse '2) mt-env) ... = (numV 2) = (numV 3) ---------------------------------------- (interp (parse '{let {[x 1]} x}) mt-env) ... (interp (parse '1) mt-env) ... = (numV 1) ... (interp (parse 'x) (extend-env (bind 'x (numV 1)) mt-env)) ... = (numV 1) = (numV 1) ---------------------------------------- (interp (parse '{let {[x 1]} {lambda {y} x}}) mt-env) ... (interp (parse '1) mt-env) ... = (numV 1) ... (interp (parse '{lambda {y} x}) E1=(extend-env (bind 'x (numV 1)) mt-env)) ... = (closV 'y (idC 'x) E1) = (closV 'y (idC 'x) E1) ---------------------------------------- (interp (parse '{let {[x 1]} {let {[f {lambda {y} {+ y x}}]} {f 3}}}) mt-env) ... (interp (parse '1) mt-env) ... = (numV 1) ... (interp (parse '{let {[f {lambda {y} {+ y x}}]} {f 3}}) E1=(extend-env (bind 'x (numV 1)) mt-env)) ..... (interp (parse '{lambda {y} {+ y x}}) E1) ..... = (closV 'y (parse '{+ y x}) E1) ..... (interp (parse '{f 3}) E2=(extend-env (bind 'f (closV 'y '{+ y x} E1)) E1) ....... (interp (parse 'f) E2) ....... = (closV 'y (parse '{+ y x}) E1) ....... (interp (parse '3) E2) ....... = (numV 3) ....... (interp (parse '{+ y x}) E3=(extend-env (bind 'y (numV 3)) E1) ......... (interp (parse 'y) E3) ......... = (numV 3) ......... (interp (parse 'x) E3) ......... = (numV 1) ....... = (numV 4) ..... = (numV 4) ... = (numV 4) = (numV 4)