aboutsummaryrefslogtreecommitdiff
path: root/HW05a_adt.scm
diff options
context:
space:
mode:
Diffstat (limited to 'HW05a_adt.scm')
-rw-r--r--HW05a_adt.scm61
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