;;; variable.ss (load "/u/c311/ss/literal.ss") (define ; EOPL Figure 5.1.1 (class () (base ) (base-inst-vars test-clauses) (base-methods (base-parse parse)) (base-init) (inst-vars (define (class () (base ) (methods (define apply (method (name) (error ' "~s is not bound" name))) (define domain (method () '()))))) (define empty-environment ()) (define (class (env names values) (base ) (inst-vars env names (define values-vector (list->vector values)) (define names-length (length names))) (methods (define apply (method (name) (let ((x (memq name names))) (if x (vector-ref values-vector (- names-length (length x))) (apply env name))))) (define domain (method () (append names (domain env))))))) (define (class (name) (base ) (inst-vars name) (methods (define eval (method () (apply initial-environment name))) (define unparse (method () name))))) (define initial-environment ( empty-environment '(emptylist) (list '()))) (set! test-clauses (append '((emptylist ())) test-clauses))) (methods (define name (method () 'variable)) (define parse (method (datum) (form-case datum (variable name ( name)) (else (base-parse this datum))))))))