racket/collects/tests/eopl/chapter5/exceptions/data-structures.scm
2012-02-24 14:46:17 -05:00

86 lines
2.0 KiB
Scheme
Executable File

(module data-structures (lib "eopl.ss" "eopl")
(require "lang.scm") ; for expression?
(provide (all-defined)) ; too many things to list
;;;;;;;;;;;;;;;; expressed values ;;;;;;;;;;;;;;;;
;;; an expressed value is either a number, a boolean, a procval, or a
;;; list of expvals.
(define-datatype expval expval?
(num-val
(value number?))
(bool-val
(boolean boolean?))
(proc-val
(proc proc?))
(list-val
(lst (list-of expval?))))
;;; extractors:
(define expval->num
(lambda (v)
(cases expval v
(num-val (num) num)
(else (expval-extractor-error 'num v)))))
(define expval->bool
(lambda (v)
(cases expval v
(bool-val (bool) bool)
(else (expval-extractor-error 'bool v)))))
(define expval->proc
(lambda (v)
(cases expval v
(proc-val (proc) proc)
(else (expval-extractor-error 'proc v)))))
(define expval->list
(lambda (v)
(cases expval v
(list-val (lst) lst)
(else (expval-extractor-error 'list v)))))
(define expval-extractor-error
(lambda (variant value)
(eopl:error 'expval-extractors "Looking for a ~s, found ~s"
variant value)))
;; ;;;;;;;;;;;;;;;; continuations ;;;;;;;;;;;;;;;;
;; moved to interp.scm
;;;;;;;;;;;;;;;; procedures ;;;;;;;;;;;;;;;;
(define-datatype proc proc?
(procedure
(bvar symbol?)
(body expression?)
(env environment?)))
;;;;;;;;;;;;;;;; environment structures ;;;;;;;;;;;;;;;;
;;; replaced by custom environment structure in environments.scm.
;;; This represents an environment as an alist ((id rhs) ...)
;;; where rhs is either an expval or a list (bvar body)
;;; expval is for extend-env; the list is for extend-env-rec.
;;; this representation is designed to make the printed representation
;;; of the environment more readable.
;;; The code for this is in environments.scm, but we need environment?
;;; for define-datatype proc, so we write an appoximation:
(define environment?
(list-of
(lambda (p)
(and
(pair? p)
(symbol? (car p))))))
)