SICP/ex-5_23-30.scm

146 lines
3.5 KiB
Scheme
Raw Normal View History

2021-04-09 14:57:35 +02:00
(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")