
The eopl language is now racket-based rather than mzscheme-based. This test-suite, which was originally distributed on the book's web-site has been re-written in the new language. Changes include dropping all drscheme-init.scm and top.scm files. Remaining files were renamed to use the .rkt extension and edited to use the #lang syntax (instead of modulue). Require and provide forms were changed to reflect racket's syntax instead of mzscheme's (eg, only-in vs. only). Several occurrences of one-armed ifs were changed to use when and unless. All tests have been run successfully.
55 lines
1.3 KiB
Racket
Executable File
55 lines
1.3 KiB
Racket
Executable File
#lang eopl
|
|
(require tests/eopl/private/utils)
|
|
|
|
;; Simple procedural representation of environments
|
|
;; Page: 40
|
|
|
|
;; data definition:
|
|
;; Env = Var -> Schemeval
|
|
|
|
;; empty-env : () -> Env
|
|
(define empty-env
|
|
(lambda ()
|
|
(lambda (search-var)
|
|
(report-no-binding-found search-var))))
|
|
|
|
;; extend-env : Var * Schemeval * Env -> Env
|
|
(define extend-env
|
|
(lambda (saved-var saved-val saved-env)
|
|
(lambda (search-var)
|
|
(if (eqv? search-var saved-var)
|
|
saved-val
|
|
(apply-env saved-env search-var)))))
|
|
|
|
;; apply-env : Env * Var -> Schemeval
|
|
(define apply-env
|
|
(lambda (env search-var)
|
|
(env search-var)))
|
|
|
|
(define report-no-binding-found
|
|
(lambda (search-var)
|
|
(eopl:error 'apply-env "No binding for ~s" search-var)))
|
|
|
|
(define report-invalid-env
|
|
(lambda (env)
|
|
(eopl:error 'apply-env "Bad environment: ~s" env)))
|
|
|
|
(define e
|
|
(extend-env 'd 6
|
|
(extend-env 'y 8
|
|
(extend-env 'x 7
|
|
(extend-env 'y 14
|
|
(empty-env))))))
|
|
|
|
(check-equal? (apply-env e 'd) 6)
|
|
(check-equal? (apply-env e 'y) 8)
|
|
(check-equal? (apply-env e 'x) 7)
|
|
|
|
(check-error (apply-env (empty-env) 'x)
|
|
"apply-env: No binding for x")
|
|
|
|
;(report-unit-tests-completed 'apply-env)
|
|
|
|
|
|
|