;;; call.ss (load "/u/c311/ss/variable.ss") (define ; EOPL Figure 5.1.1 (class () (base ) (base-inst-vars initial-environment test-clauses) (base-methods (base-parse parse)) (base-init) (inst-vars (define (class (rator rands) (base ) (inst-vars rator rands) (methods (define eval (method () (apply (eval rator) (eval rands)))) (define unparse (method () (cons (unparse rator) (unparse rands))))))) (define (class (exps) (base ) (inst-vars exps) (methods (define eval (method () (map eval exps))) (define unparse (method () (map unparse exps)))))) (define (let ((apply-proc apply)) (class (proc) (base ) (inst-vars proc) (methods (define apply (method (args) (apply-proc proc args))))))) (set! initial-environment ( initial-environment '(+ - * add1 sub1) (map (list + - * (lambda (n) (+ n 1)) (lambda (n) (- n 1)))))) (set! test-clauses (append '(((+ 1 2) 3) ((* (- 5 3) (add1 (sub1 3))) 6)) test-clauses))) (methods (define name (method () 'call)) (define parse (method (datum) (form-case datum (call (rator . rands) ( (parse this rator) ( (map (lambda (rand) (parse this rand)) rands)))) (else (base-parse this datum))))))))