diff options
Diffstat (limited to 'HW05a_adt.scm')
-rw-r--r-- | HW05a_adt.scm | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/HW05a_adt.scm b/HW05a_adt.scm new file mode 100644 index 0000000..5f8bd34 --- /dev/null +++ b/HW05a_adt.scm @@ -0,0 +1,61 @@ +#lang eopl + +;; HW05a - Environments +;; Part 2: Abstract Syntax Tree +;; +;; CSI-310 Programming Languages +;; Due: 2013-02-25 +;; Name: Ben Burwell + + +;; helpers and data types +(define scheme-value? + (lambda (a) #t)) + +(define-datatype env env? + (empty-env-record) + (extended-env-record + (defs (list-of (list-of scheme-value?))) + (prev-env env?))) + +;; some basics +(define empty-env + (lambda () + (empty-env-record))) + +(define extend-env + (lambda (defs prev-env) + (extended-env-record defs prev-env))) + +;; more helpers +(define def-exists? + (lambda (sym defs) + (cond + [ (equal? (length defs) 0) #f ] + [ (equal? (caar defs) sym) #t ] + [ else (def-exists? sym (cdr defs)) ] + ))) + +(define get-def + (lambda (sym defs) + (cond + [ (equal? (length defs) 0) 'error ] + [ (equal? (caar defs) sym) (cadar defs) ] + [ else (get-def sym (cdr defs)) ] + ))) + +;; now the fun stuff +(define apply-env + (lambda (this-env sym) + (cases env this-env + (empty-env-record + () + (eopl:error 'apply-env "No binding for ~s" sym)) + (extended-env-record + (defs prev-env) + (if (def-exists? sym defs) + (get-def sym defs) + (apply-env prev-env sym)))))) + +;; tests +(apply-env (extend-env '((a 4) (b 5)) (extend-env '((a 1) (b 2) (c 3)) (empty-env))) 'a)
\ No newline at end of file |