;; This is an example of what an interaction with the talkative meta-circular ;; evaluator might look like. Anything not identified by a comment as being ;; typed by the user is output from the program. ;; First the user types the following line and evaluates in normal scheme: (initialize-evaluator) Creating new frame 1 as global environment binding (nil t + - * / = < > 1+ -1+ cons car cdr atom? eq? null? not) to (() #T (primitive +) (primitive -) (primitive *) (primitive /) (primitive =) (primitive <) (primitive >) (primitive 1+) (primitive -1+) (primitive cons) (primitive car) (primitive cdr) (primitive atom?) (primitive eq?) (primitive null?) (primitive not)) ;; Now, in "mini-scheme", the user types and evaluates this definition: (define fact (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n))))) Evaluating (define fact (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n))))) in environment 1 Evaluating (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) in environment 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) No binding found for fact in frame 1 Adding binding to (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Result is fact ;Value: fact ;; The user types the next line and evaluates it, still in mini-scheme (fact 4) Evaluating (fact 4) in environment 1 Evaluating 4 in environment 1 Result is 4 Evaluating fact in environment 1 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) to (4) Creating new frame 2 with parent 1 binding (n) to (4) Evaluating (cond ((= n 0) 1) (else (* (fact (- n 1)) n))) in environment 2 Evaluating (= n 0) in environment 2 Evaluating 0 in environment 2 Result is 0 Evaluating n in environment 2 Found binding for n in frame 2 Result is 4 Evaluating = in environment 2 No binding found for = in frame 2 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (4 0) Result is () Evaluating (* (fact (- n 1)) n) in environment 2 Evaluating n in environment 2 Found binding for n in frame 2 Result is 4 Evaluating (fact (- n 1)) in environment 2 Evaluating (- n 1) in environment 2 Evaluating 1 in environment 2 Result is 1 Evaluating n in environment 2 Found binding for n in frame 2 Result is 4 Evaluating - in environment 2 No binding found for - in frame 2 Found binding for - in frame 1 Result is (primitive -) Applying (primitive -) to (4 1) Result is 3 Evaluating fact in environment 2 No binding found for fact in frame 2 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) to (3) Creating new frame 3 with parent 1 binding (n) to (3) Evaluating (cond ((= n 0) 1) (else (* (fact (- n 1)) n))) in environment 3 Evaluating (= n 0) in environment 3 Evaluating 0 in environment 3 Result is 0 Evaluating n in environment 3 Found binding for n in frame 3 Result is 3 Evaluating = in environment 3 No binding found for = in frame 3 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (3 0) Result is () Evaluating (* (fact (- n 1)) n) in environment 3 Evaluating n in environment 3 Found binding for n in frame 3 Result is 3 Evaluating (fact (- n 1)) in environment 3 Evaluating (- n 1) in environment 3 Evaluating 1 in environment 3 Result is 1 Evaluating n in environment 3 Found binding for n in frame 3 Result is 3 Evaluating - in environment 3 No binding found for - in frame 3 Found binding for - in frame 1 Result is (primitive -) Applying (primitive -) to (3 1) Result is 2 Evaluating fact in environment 3 No binding found for fact in frame 3 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) to (2) Creating new frame 4 with parent 1 binding (n) to (2) Evaluating (cond ((= n 0) 1) (else (* (fact (- n 1)) n))) in environment 4 Evaluating (= n 0) in environment 4 Evaluating 0 in environment 4 Result is 0 Evaluating n in environment 4 Found binding for n in frame 4 Result is 2 Evaluating = in environment 4 No binding found for = in frame 4 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (2 0) Result is () Evaluating (* (fact (- n 1)) n) in environment 4 Evaluating n in environment 4 Found binding for n in frame 4 Result is 2 Evaluating (fact (- n 1)) in environment 4 Evaluating (- n 1) in environment 4 Evaluating 1 in environment 4 Result is 1 Evaluating n in environment 4 Found binding for n in frame 4 Result is 2 Evaluating - in environment 4 No binding found for - in frame 4 Found binding for - in frame 1 Result is (primitive -) Applying (primitive -) to (2 1) Result is 1 Evaluating fact in environment 4 No binding found for fact in frame 4 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) to (1) Creating new frame 5 with parent 1 binding (n) to (1) Evaluating (cond ((= n 0) 1) (else (* (fact (- n 1)) n))) in environment 5 Evaluating (= n 0) in environment 5 Evaluating 0 in environment 5 Result is 0 Evaluating n in environment 5 Found binding for n in frame 5 Result is 1 Evaluating = in environment 5 No binding found for = in frame 5 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (1 0) Result is () Evaluating (* (fact (- n 1)) n) in environment 5 Evaluating n in environment 5 Found binding for n in frame 5 Result is 1 Evaluating (fact (- n 1)) in environment 5 Evaluating (- n 1) in environment 5 Evaluating 1 in environment 5 Result is 1 Evaluating n in environment 5 Found binding for n in frame 5 Result is 1 Evaluating - in environment 5 No binding found for - in frame 5 Found binding for - in frame 1 Result is (primitive -) Applying (primitive -) to (1 1) Result is 0 Evaluating fact in environment 5 No binding found for fact in frame 5 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (cond ((= n 0) 1) (else (* (fact (- n 1)) n)))) pointing-to-environment 1) to (0) Creating new frame 6 with parent 1 binding (n) to (0) Evaluating (cond ((= n 0) 1) (else (* (fact (- n 1)) n))) in environment 6 Evaluating (= n 0) in environment 6 Evaluating 0 in environment 6 Result is 0 Evaluating n in environment 6 Found binding for n in frame 6 Result is 0 Evaluating = in environment 6 No binding found for = in frame 6 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (0 0) Result is #T Evaluating 1 in environment 6 Result is 1 Evaluating * in environment 5 No binding found for * in frame 5 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (1 1) Result is 1 Evaluating * in environment 4 No binding found for * in frame 4 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (1 2) Result is 2 Evaluating * in environment 3 No binding found for * in frame 3 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (2 3) Result is 6 Evaluating * in environment 2 No binding found for * in frame 2 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (6 4) Result is 24 ;Value: 24 ;; The next definition is also typed in and evaluated in mini-scheme: (define make-counter (lambda (c) (lambda () (set! c (+ c 1)) c))) Evaluating (define make-counter (lambda (c) (lambda () (set! c (+ c 1)) c))) in environment 1 Evaluating (lambda (c) (lambda () (set! c (+ c 1)) c)) in environment 1 Result is (compound-procedure (lambda (c) (lambda () (set! c (+ c 1)) c)) pointing-to-environment 1) No binding found for make-counter in frame 1 Adding binding to (compound-procedure (lambda (c) (lambda () (set! c (+ c 1)) c)) pointing-to-environment 1) Result is make-counter ;Value: make-counter (define c (make-counter 0)) Evaluating (define c (make-counter 0)) in environment 1 Evaluating (make-counter 0) in environment 1 Evaluating 0 in environment 1 Result is 0 Evaluating make-counter in environment 1 Found binding for make-counter in frame 1 Result is (compound-procedure (lambda (c) (lambda () (set! c (+ c 1)) c)) pointing-to-environment 1) Applying (compound-procedure (lambda (c) (lambda () (set! c (+ c 1)) c)) pointing-to-environment 1) to (0) Creating new frame 7 with parent 1 binding (c) to (0) Evaluating (lambda () (set! c (+ c 1)) c) in environment 7 Result is (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) No binding found for c in frame 1 Adding binding to (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) Result is c ;Value: c ;; Now the user tries (c) out in mini-scheme: (c) Evaluating (c) in environment 1 Evaluating c in environment 1 Found binding for c in frame 1 Result is (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) Applying (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) to () Creating new frame 8 with parent 7 binding () to () Evaluating (set! c (+ c 1)) in environment 8 Evaluating (+ c 1) in environment 8 Evaluating 1 in environment 8 Result is 1 Evaluating c in environment 8 No binding found for c in frame 8 Found binding for c in frame 7 Result is 0 Evaluating + in environment 8 No binding found for + in frame 8 No binding found for + in frame 7 Found binding for + in frame 1 Result is (primitive +) Applying (primitive +) to (0 1) Result is 1 No binding found for c in frame 8 Found binding for c in frame 7 Changing binding to 1 Result is 1 Evaluating c in environment 8 No binding found for c in frame 8 Found binding for c in frame 7 Result is 1 ;Value: 1 ;; Now the user types and evaluates (c) a second time in mini-scheme: (c) Evaluating (c) in environment 1 Evaluating c in environment 1 Found binding for c in frame 1 Result is (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) Applying (compound-procedure (lambda () (set! c (+ c 1)) c) pointing-to-environment 7) to () Creating new frame 9 with parent 7 binding () to () Evaluating (set! c (+ c 1)) in environment 9 Evaluating (+ c 1) in environment 9 Evaluating 1 in environment 9 Result is 1 Evaluating c in environment 9 No binding found for c in frame 9 Found binding for c in frame 7 Result is 1 Evaluating + in environment 9 No binding found for + in frame 9 No binding found for + in frame 7 Found binding for + in frame 1 Result is (primitive +) Applying (primitive +) to (1 1) Result is 2 No binding found for c in frame 9 Found binding for c in frame 7 Changing binding to 2 Result is 2 Evaluating c in environment 9 No binding found for c in frame 9 Found binding for c in frame 7 Result is 2 ;Value: 2 ;; Now the user types in a re-definition of fact and evaluates in mini-scheme: (define fact (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1))) Evaluating (define fact (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1))) in environment 1 Evaluating (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1)) in environment 1 Result is (compound-procedure (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1)) pointing-to-environment 1) Found binding for fact in frame 1 Changing binding to (compound-procedure (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1)) pointing-to-environment 1) Result is fact ;Value: fact ;; Now the user types (fact 4) and evaluates this test in mini-scheme: (fact 4) Evaluating (fact 4) in environment 1 Evaluating 4 in environment 1 Result is 4 Evaluating fact in environment 1 Found binding for fact in frame 1 Result is (compound-procedure (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1)) pointing-to-environment 1) Applying (compound-procedure (lambda (n) (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) (fact-times n 1)) pointing-to-environment 1) to (4) Creating new frame 10 with parent 1 binding (n) to (4) Evaluating (define fact-times (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))))) in environment 10 Evaluating (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) in environment 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) No binding found for fact-times in frame 10 Adding binding to (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Result is fact-times Evaluating (fact-times n 1) in environment 10 Evaluating 1 in environment 10 Result is 1 Evaluating n in environment 10 Found binding for n in frame 10 Result is 4 Evaluating fact-times in environment 10 Found binding for fact-times in frame 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Applying (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) to (4 1) Creating new frame 11 with parent 10 binding (n p) to (4 1) Evaluating (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))) in environment 11 Evaluating (= n 0) in environment 11 Evaluating 0 in environment 11 Result is 0 Evaluating n in environment 11 Found binding for n in frame 11 Result is 4 Evaluating = in environment 11 No binding found for = in frame 11 No binding found for = in frame 10 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (4 0) Result is () Evaluating (fact-times (-1+ n) (* n p)) in environment 11 Evaluating (* n p) in environment 11 Evaluating p in environment 11 Found binding for p in frame 11 Result is 1 Evaluating n in environment 11 Found binding for n in frame 11 Result is 4 Evaluating * in environment 11 No binding found for * in frame 11 No binding found for * in frame 10 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (4 1) Result is 4 Evaluating (-1+ n) in environment 11 Evaluating n in environment 11 Found binding for n in frame 11 Result is 4 Evaluating -1+ in environment 11 No binding found for -1+ in frame 11 No binding found for -1+ in frame 10 Found binding for -1+ in frame 1 Result is (primitive -1+) Applying (primitive -1+) to (4) Result is 3 Evaluating fact-times in environment 11 No binding found for fact-times in frame 11 Found binding for fact-times in frame 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Applying (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) to (3 4) Creating new frame 12 with parent 10 binding (n p) to (3 4) Evaluating (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))) in environment 12 Evaluating (= n 0) in environment 12 Evaluating 0 in environment 12 Result is 0 Evaluating n in environment 12 Found binding for n in frame 12 Result is 3 Evaluating = in environment 12 No binding found for = in frame 12 No binding found for = in frame 10 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (3 0) Result is () Evaluating (fact-times (-1+ n) (* n p)) in environment 12 Evaluating (* n p) in environment 12 Evaluating p in environment 12 Found binding for p in frame 12 Result is 4 Evaluating n in environment 12 Found binding for n in frame 12 Result is 3 Evaluating * in environment 12 No binding found for * in frame 12 No binding found for * in frame 10 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (3 4) Result is 12 Evaluating (-1+ n) in environment 12 Evaluating n in environment 12 Found binding for n in frame 12 Result is 3 Evaluating -1+ in environment 12 No binding found for -1+ in frame 12 No binding found for -1+ in frame 10 Found binding for -1+ in frame 1 Result is (primitive -1+) Applying (primitive -1+) to (3) Result is 2 Evaluating fact-times in environment 12 No binding found for fact-times in frame 12 Found binding for fact-times in frame 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Applying (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) to (2 12) Creating new frame 13 with parent 10 binding (n p) to (2 12) Evaluating (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))) in environment 13 Evaluating (= n 0) in environment 13 Evaluating 0 in environment 13 Result is 0 Evaluating n in environment 13 Found binding for n in frame 13 Result is 2 Evaluating = in environment 13 No binding found for = in frame 13 No binding found for = in frame 10 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (2 0) Result is () Evaluating (fact-times (-1+ n) (* n p)) in environment 13 Evaluating (* n p) in environment 13 Evaluating p in environment 13 Found binding for p in frame 13 Result is 12 Evaluating n in environment 13 Found binding for n in frame 13 Result is 2 Evaluating * in environment 13 No binding found for * in frame 13 No binding found for * in frame 10 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (2 12) Result is 24 Evaluating (-1+ n) in environment 13 Evaluating n in environment 13 Found binding for n in frame 13 Result is 2 Evaluating -1+ in environment 13 No binding found for -1+ in frame 13 No binding found for -1+ in frame 10 Found binding for -1+ in frame 1 Result is (primitive -1+) Applying (primitive -1+) to (2) Result is 1 Evaluating fact-times in environment 13 No binding found for fact-times in frame 13 Found binding for fact-times in frame 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Applying (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) to (1 24) Creating new frame 14 with parent 10 binding (n p) to (1 24) Evaluating (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))) in environment 14 Evaluating (= n 0) in environment 14 Evaluating 0 in environment 14 Result is 0 Evaluating n in environment 14 Found binding for n in frame 14 Result is 1 Evaluating = in environment 14 No binding found for = in frame 14 No binding found for = in frame 10 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (1 0) Result is () Evaluating (fact-times (-1+ n) (* n p)) in environment 14 Evaluating (* n p) in environment 14 Evaluating p in environment 14 Found binding for p in frame 14 Result is 24 Evaluating n in environment 14 Found binding for n in frame 14 Result is 1 Evaluating * in environment 14 No binding found for * in frame 14 No binding found for * in frame 10 Found binding for * in frame 1 Result is (primitive *) Applying (primitive *) to (1 24) Result is 24 Evaluating (-1+ n) in environment 14 Evaluating n in environment 14 Found binding for n in frame 14 Result is 1 Evaluating -1+ in environment 14 No binding found for -1+ in frame 14 No binding found for -1+ in frame 10 Found binding for -1+ in frame 1 Result is (primitive -1+) Applying (primitive -1+) to (1) Result is 0 Evaluating fact-times in environment 14 No binding found for fact-times in frame 14 Found binding for fact-times in frame 10 Result is (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) Applying (compound-procedure (lambda (n p) (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p))))) pointing-to-environment 10) to (0 24) Creating new frame 15 with parent 10 binding (n p) to (0 24) Evaluating (cond ((= n 0) p) (else (fact-times (-1+ n) (* n p)))) in environment 15 Evaluating (= n 0) in environment 15 Evaluating 0 in environment 15 Result is 0 Evaluating n in environment 15 Found binding for n in frame 15 Result is 0 Evaluating = in environment 15 No binding found for = in frame 15 No binding found for = in frame 10 Found binding for = in frame 1 Result is (primitive =) Applying (primitive =) to (0 0) Result is #T Evaluating p in environment 15 Found binding for p in frame 15 Result is 24 ;Value: 24