146 lines
3.5 KiB
Scheme
146 lines
3.5 KiB
Scheme
(load "util.scm")
|
|
(load "misc/sicp-regsim.scm")
|
|
(load "misc/sicp-eceval.scm")
|
|
|
|
(define the-global-environment (setup-environment))
|
|
(set-register-contents! eceval 'exp '(if false 1 2))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 2)
|
|
|
|
(display "\nex-5.23 - derived-expressions\n")
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(cond
|
|
((= 1 2) 0)
|
|
((= 2 3) 1)
|
|
((= 0 4) 2)
|
|
(else 3)))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 3)
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(begin
|
|
(define (square x) (* x x))
|
|
(let ((y (square 3)))
|
|
y)))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 9)
|
|
|
|
|
|
(display "\nex-5.24 - cond-special-form\n")
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(cond
|
|
((= 2 1) 0)
|
|
((= 2 3) 1)
|
|
((= 0 4) 2)
|
|
(else (* 2 5))))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 10)
|
|
|
|
(display "\nex-5.25 - lazy-evaluation\n")
|
|
|
|
(set-register-contents! eceval-lazy 'exp
|
|
'(begin
|
|
(define (try a b)
|
|
(if (= a 0) 1 b))
|
|
(try 0 (/ 1 0))))
|
|
(start eceval-lazy)
|
|
(assert (get-register-contents eceval-lazy 'val) 1)
|
|
|
|
|
|
(display "\nex-5.26 - fact-iter-stack-analysis\n")
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(begin
|
|
(define (factorial n)
|
|
(define (iter product counter)
|
|
(if (> counter n)
|
|
product
|
|
(iter (* product counter) (+ counter 1))))
|
|
(iter 1 1))
|
|
(factorial 5)))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 120)
|
|
|
|
; | 1 | 2 | 3 | 4 | 5 | n
|
|
; |----|----|----|----|----|
|
|
; | 10| 10| 10| 10| 10| depth
|
|
; | 70| 105| 140| 175| 210| push count
|
|
|
|
; depth = 10
|
|
; push-count = 35 * (n + 1)
|
|
|
|
(display "\nex-5.27 - fact-rec-stack-analysis\n")
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(begin
|
|
(define (factorial n)
|
|
(if (= n 1)
|
|
1
|
|
(* n (factorial (- n 1)))))
|
|
(factorial 5)))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 120)
|
|
|
|
; | 1 | 2 | 3 | 4 | 5 | n
|
|
; |----|----|----|----|----|
|
|
; | 8| 11| 14| 17| 20| depth
|
|
; | 22| 54| 86| 118| 150| push count
|
|
|
|
; depth = 5 + n * 3
|
|
; push-count = 22 + (n - 1) * 32
|
|
|
|
(display "\nex-5.28 - fact-lazy-stack-analysis\n")
|
|
|
|
(set-register-contents! eceval-lazy 'exp
|
|
'(begin
|
|
(define (factorial n)
|
|
(define (iter product counter)
|
|
(if (> counter n)
|
|
product
|
|
(iter (* product counter) (+ counter 1))))
|
|
(iter 1 1))
|
|
(factorial 5)))
|
|
(start eceval-lazy)
|
|
(assert (get-register-contents eceval-lazy 'val) 120)
|
|
|
|
(set-register-contents! eceval-lazy 'exp
|
|
'(begin
|
|
(define (factorial n)
|
|
(if (= n 1)
|
|
1
|
|
(* n (factorial (- n 1)))))
|
|
(factorial 5)))
|
|
(start eceval-lazy)
|
|
(assert (get-register-contents eceval-lazy 'val) 120)
|
|
|
|
; | 1 | 2 | 3 | 4 | 5 | n
|
|
; |----|----|----|----|----|
|
|
; lazy-iter | 13| 18| 23| 28| 33| depth
|
|
; | 61| 108| 171| 250| 345| push count
|
|
; |----|----|----|----|----|
|
|
; lazy-rec | 8| 16| 24| 32| 40| depth
|
|
; | 21| 52| 99| 162| 241| push count
|
|
|
|
(display "\nex-5.29 - fib-stack-analysis\n")
|
|
|
|
(set-register-contents! eceval 'exp
|
|
'(begin
|
|
(define (fib n)
|
|
(if (< n 2)
|
|
n
|
|
(+ (fib (- n 1)) (fib (- n 2)))))
|
|
(fib 7)))
|
|
(start eceval)
|
|
(assert (get-register-contents eceval 'val) 13)
|
|
|
|
; | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
|
; |----|----|----|----|----|----|----|----|----|----|
|
|
; | | | | | | | | | | | depth
|
|
; | | | | | | | | | | | push count
|
|
|
|
(display "\nex-5.30\n")
|
|
|
|
|