(interp (app (fun 'f (app (id 'f) (num 8))) ; {{fun {f} {f 8}} (fun 'y (add (id 'y) (num 4)))) ; {fun {y} {+ y 4}}} (mtSub)) ... (interp (fun 'f (app (id 'f) (num 8))) ; {fun {f} {f 8}} (mtSub)) returns (closureV 'f (app (id 'f) (num 8)) (mtSub)) which becomes fun-val in `app' of `interp' ... (interp (fun 'y (add (id 'y) (num 4))) ; {fun {y} {+ y 4}} (mtSub)) returns (closureV 'y (add (id 'y) (num 4)) (mtSub)) which becomes arg-val i `app' of `interp' ... (interp (app (id 'f) (num 8)) (aSub 'f (closureV 'y (add (id 'y) (num 4)) (mtSub)) (mtSub))) ... (interp (id 'f) (aSub 'f (closureV 'y (add (id 'y) (num 4)) (mtSub)) (mtSub))) return (closureV 'y (add (id 'y) (num 4)) (mtSub)) which becomes fun-val in `app' of `interp' ... (interp (num 8) (aSub 'f (closureV 'y (add (id 'y) (num 4)) (mtSub)) (mtSub))) returns (numV 8) which becomes arg-val in `app' of `interp' ... (interp (add (id 'y) (num 4)) (aSub 'y (numV 8) (mtSub))) ... (interp (id 'y) (aSub 'y (numV 8) (mtSub))) returns (numV 8) ... (interp (num 4) (aSub 'y (numV 8) (mtSub))) returns (numV 4) ... (num+ (numV 8) (numV 4)) return (numV 12)