sicp/mceval/test-eval.rkt

93 lines
2.9 KiB
Racket

#lang sicp
;; Exercise 4.24: Define a procedure to run a program through an
;; interpreter and time the run.
(#%require "dd-mceval.rkt"
"analyzing-mceval.rkt"
"leval.rkt"
"timing.rkt")
(#%require (only racket/base module+))
(define (fact-program x)
`((define (fact n)
(if (= n 1) 1
(* n (fact (- n 1)))))
(fact ,x)))
(define (fib-program x)
`((define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else
(+ (fib (- n 2))
(fib (- n 1))))))
(fib ,x)))
(define lazy-test-program
'((define (try a b)
(if (= a 0) 1 b))
(try 0 (/ 1 0))))
(define lazy-integral-program
'((define (integral integrand initial-value dt)
(define int
(cons initial-value
(add-lists (scale-list integrand dt)
int)))
int)
(define (solve f y0 dt)
(define y (integral dy y0 dt))
(define dy (map f y))
y)
(define solution (solve (lambda (x) x) 1 0.001))
(list-ref solution 1000)))
(#%require rackunit)
(module+ test
(check-equal? (dd-eval-program (fact-program 1)) 1)
(check-equal? (analyzing-eval-program (fact-program 1)) 1)
(check-equal? (lazy-eval-program (fact-program 1)) 1)
(check-equal? (dd-eval-program (fact-program 5)) 120)
(check-equal? (analyzing-eval-program (fact-program 5)) 120)
(check-equal? (lazy-eval-program (fact-program 5)) 120)
(check-equal? (dd-eval-program (fact-program 10))
(analyzing-eval-program (fact-program 10)))
(check-equal? (dd-eval-program (fib-program 5))
(analyzing-eval-program (fib-program 5)))
(check-equal? (dd-eval-program (fib-program 5))
(lazy-eval-program (fib-program 5)))
(check-equal? (lazy-eval-program lazy-test-program) 1)
(check-= (lazy-eval-program lazy-integral-program) 2.7169 0.01)
)
(module+ timing
(define dd-fib (time-proc 100 (lambda () (dd-eval-program (fib-program 10)))))
(define analyzing-fib (time-proc 100 (lambda () (analyzing-eval-program (fib-program 10)))))
(define dd-fact (time-proc 100 (lambda () (dd-eval-program (fact-program 50)))))
(define analyzing-fact (time-proc 100 (lambda () (analyzing-eval-program (fact-program 50)))))
(display `("Fib: dd " ,dd-fib " analyzing " ,analyzing-fib " speed-up " ,(/ dd-fib analyzing-fib)))
(newline)
(display `("Fact: dd " ,dd-fact " analyzing " ,analyzing-fact " speed-up " ,(/ dd-fib analyzing-fact))))
;; Test results
;; test-eval.rkt> (time-proc 100 eval-program fib-program mce-eval mce-user-print)
;; 203/100
;; test-eval.rkt> (time-proc 100 eval-program fib-program analyzing-eval analyzing-user-print)
;; 18/25
;; test-eval.rkt> (time-proc 100 eval-program fact-program mce-eval mce-user-print)
;; 183/100
;; test-eval.rkt> (time-proc 100 eval-program fact-program analyzing-eval analyzing-user-print)
;; 89/100
;; This demonstrates the substantially better performance of the
;; analyzing evaluator.