#lang racket (require "chez-init.rkt") (require racket/trace) (define-datatype environment environment? [empty-env-record] [extended-env-record (syms (listof symbol?)) (vals vector?) (env environment?)]) (define empty-env (lambda () (empty-env-record))) (define extend-env (lambda (syms vals env) (extended-env-record syms (list->vector vals) env))) (define apply-env (lambda (env sym) (cases environment env [empty-env-record () (error 'apply-env "No binding for ~s" sym)] [extended-env-record (syms vals env) (let ((pos (find-position sym syms 0))) (if (number? pos) (vector-ref vals pos) (apply-env env sym)))]))) (trace apply-env) (define find-position (lambda (sym ls pos) (cond [(null? ls) #f] [(eq? sym (car ls)) pos] [else (find-position sym (cdr ls) (+ pos 1))]))) (define e1 (extend-env '(a b) '(3 4) (empty-env))) (define e2 (extend-env '(c d) '(5 6) e1))