;;; Vikram Subramaniam ;;; HW 8 (load "/usr4/c311/ss/form-case.ss") ;(load "/usr4/c311/vikram/prelims-for-hw8.ss") (define dynamic-variable? (lambda (var) (char=? #\: (string-ref (symbol->string var) 0)))) (define (class () (base ) (base-inst-vars initial-environment test-clauses) (base-methods (base-parse parse)) (base-init) (inst-vars (set! test-clauses (append '(((let ((x 3) (y 4)) (let ((f (proc (a) (+ a y))) (y 5)) (f x))) 7) ((let ((x 3) (:y 4)) (let ((f (proc (a) (+ a :y))) (:y 5)) (f x))) 8) ((let ((x 3) (:y 4) (:z 5)) (let ((:y 6) (g (proc () (+ x :y :z)))) (g))) 14) ((let ((x 3) (y 4) (z 5)) (let ((y 6) (g (proc () (+ x y z)))) (g))) 12)) test-clauses)) (define (class (name) (base ) (inst-vars name) (methods (define eval (method (s-env d-env) (apply s-env name))) (define unparse (method () name))))) (define (class (name) (base ) (inst-vars name) (methods (define eval (method (s-env d-env) (apply d-env name))) (define unparse (method () name))))) (set! (class (datum) (base ) (base-inst-vars datum) (base-init datum) (methods (define eval (method (s-env d-env) datum))))) (set! (class (rator rands) (base ) (base-inst-vars rator rands) (base-init rator rands) (methods (define eval (method (s-env d-env) (let ((proc (eval rator s-env d-env)) (args (eval rands s-env d-env))) (if (isa? proc ) (apply proc args d-env) (apply proc args)))))))) (set! (class (exps) (base ) (base-inst-vars exps) (base-init exps) (methods (define eval (method (s-env d-env) (map (lambda (exp) (eval exp s-env d-env)) exps)))))) (set! (class (test consequent alternative) (base ) (base-inst-vars test consequent alternative) (base-init test consequent alternative) (methods (define eval (method (s-env d-env) (if (not (zero? (eval test s-env d-env))) (eval consequent s-env d-env) (eval alternative s-env d-env))))))) (set! (class (formals body) (base ) (base-inst-vars formals body) (base-init formals body) (methods (define eval (method (s-env d-env) ( formals body s-env)))))) (set! (class (formals body env) (base ) (base-inst-vars formals body env) (base-init formals body env) (methods (define apply (method (args d-env) (letrec ((h-static (lambda (f-ls a-ls s-env) (cond ((null? f-ls) s-env) ((not (dynamic-variable? (car f-ls))) (h-static (cdr f-ls) (cdr a-ls) ( s-env (list (car f-ls)) (list (car a-ls))))) (else (h-static (cdr f-ls) (cdr a-ls) s-env))))) (h-dynamic (lambda (f-ls a-ls d-env) (cond ((null? f-ls) d-env) ((dynamic-variable? (car f-ls)) (h-dynamic (cdr f-ls) (cdr a-ls) ( d-env (list (car f-ls)) (list (car a-ls))))) (else (h-dynamic (cdr f-ls) (cdr a-ls) d-env)))))) (eval body (h-static formals args env) (h-dynamic formals args d-env))))))))) (methods (define name (method () 'static-and-dynamic)) (define parse (method (datum) (form-case datum (variable name (if (dynamic-variable? name) ( name) ( name))) (else (base-parse this datum))))) (define evaluate (method (datum) (eval (parse this datum) initial-environment ()))))))