#lang racket
;;;;;;;;;;
;; 4.22 ;;
;;;;;;;;;;
;; We only need to add a clause to analyze instructing it to recurse on
;; let->combination:
;; [(let? expr) (analyze (let->combination expr))]
;; Otherwise, nothing else needs to change.
;;;;;;;;;;
;; 4.23 ;;
;;;;;;;;;;
;; Alyssa's code performs unnecessary lambda wrapping and so is less efficient than
;; the book code.
;; For example, if procs contains just the one procedure p, Alyssa's code returns
;; (lambda (env) (p env)), whereas the book code simply returns p.
;; And in the case where procs consists of the two procedures p and q, Alyssa's code
;; returns (lambda (env) (p env) (lambda (env) (q env))), whereas the book code
;; simply returns (lambda (env) (p env) (q env)).
;;;;;;;;;;
;; 4.24 ;;
;;;;;;;;;;
;; We'll compare how long the two interpreters take to compute some values of the
;; recursive fibonacci function.
;; Comment out one of these before running the other.
;; (require "4-1-4-repl-program.rkt")
(require "4-1-7-repl-program.rkt")
(my-eval '(define (fib n)
(cond [(= n 1) 1]
[(= n 0) 0]
[else (+ (fib (- n 1)) (fib (- n 2)))]))
the-global-environment)
;; 'ok
;; ;; NO SEPARATE SYNTACTIC ANALYSIS
;; (time (my-eval '(fib 15) the-global-environment))
;; ;; cpu time: 46 real time: 56 gc time: 0
;; ;; 610
;; (time (my-eval '(fib 20) the-global-environment))
;; ;; cpu time: 688 real time: 680 gc time: 63
;; ;; 6765
;; (time (my-eval '(fib 25) the-global-environment))
;; ;; cpu time: 7016 real time: 7068 gc time: 205
;; ;; 75025
;; (time (my-eval '(fib 30) the-global-environment))
;; ;; cpu time: 76875 real time: 77585 gc time: 1803
;; ;; 832040
;; WITH SEPARATE SYNTACTIC ANALYSIS
(time (my-eval '(fib 15) the-global-environment))
;; cpu time: 31 real time: 27 gc time: 0
;; 610
(time (my-eval '(fib 20) the-global-environment))
;; cpu time: 328 real time: 338 gc time: 31
;; 6765
(time (my-eval '(fib 25) the-global-environment))
;; cpu time: 3406 real time: 3435 gc time: 126
;; 75025
(time (my-eval '(fib 30) the-global-environment))
;; cpu time: 38234 real time: 39212 gc time: 1657
;; 832040
;; Of course recursive fibonacci is exponential, an additive increase in input
;; results in a multiplicative increase in run time. Even so, separating out
;; syntactic analysis has cut the run times in half, a significant savings.
Comments
0 B
|👍
/👎
0 B
|👍
/👎