
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.
74 lines
1.5 KiB
Racket
Executable File
74 lines
1.5 KiB
Racket
Executable File
#lang eopl
|
|
|
|
;; data structures for let-lang.
|
|
|
|
(provide (all-defined-out)) ; too many things to list
|
|
|
|
;;;;;;;;;;;;;;;; expressed values ;;;;;;;;;;;;;;;;
|
|
|
|
;;; an expressed value is either a number, a boolean or a procval.
|
|
|
|
(define-datatype expval expval?
|
|
(num-val
|
|
(value number?))
|
|
(bool-val
|
|
(boolean boolean?)))
|
|
|
|
;;; extractors:
|
|
|
|
;; expval->num : ExpVal -> Int
|
|
;; Page: 70
|
|
(define expval->num
|
|
(lambda (v)
|
|
(cases expval v
|
|
(num-val (num) num)
|
|
(else (expval-extractor-error 'num v)))))
|
|
|
|
;; expval->bool : ExpVal -> Bool
|
|
;; Page: 70
|
|
(define expval->bool
|
|
(lambda (v)
|
|
(cases expval v
|
|
(bool-val (bool) bool)
|
|
(else (expval-extractor-error 'bool v)))))
|
|
|
|
(define expval-extractor-error
|
|
(lambda (variant value)
|
|
(eopl:error 'expval-extractors "Looking for a ~s, found ~s"
|
|
variant value)))
|
|
|
|
;;;;;;;;;;;;;;;; environment structures ;;;;;;;;;;;;;;;;
|
|
|
|
;; example of a data type built without define-datatype
|
|
|
|
(define empty-env-record
|
|
(lambda ()
|
|
'()))
|
|
|
|
(define extended-env-record
|
|
(lambda (sym val old-env)
|
|
(cons (list sym val) old-env)))
|
|
|
|
(define empty-env-record? null?)
|
|
|
|
(define environment?
|
|
(lambda (x)
|
|
(or (empty-env-record? x)
|
|
(and (pair? x)
|
|
(symbol? (car (car x)))
|
|
(expval? (cadr (car x)))
|
|
(environment? (cdr x))))))
|
|
|
|
(define extended-env-record->sym
|
|
(lambda (r)
|
|
(car (car r))))
|
|
|
|
(define extended-env-record->val
|
|
(lambda (r)
|
|
(cadr (car r))))
|
|
|
|
(define extended-env-record->old-env
|
|
(lambda (r)
|
|
(cdr r)))
|
|
|