Implement till 5.28
This commit is contained in:
145
ex-5_23-30.scm
Normal file
145
ex-5_23-30.scm
Normal file
@@ -0,0 +1,145 @@
|
||||
(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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user