(define *environment* '())
(define (m-top-eval s) (m-eval s *environment*))
(define (m-eval s env) ; Eval expr S in ENV
(cond ((or (eq? s #t) (eq? s #f) (null? s)
(number? s) (string? s) (char? s))
s) ; constants evaluate to themselves
((symbol? s) (m-value s env))
((eq? (car s) 'quote) (cadr s))
((eq? (car s) 'if) (m-if s env))
((eq? (car s) 'let) (m-let s env))
((eq? (car s) 'set!) (m-set! s env))
((eq? (car s) 'begin) (m-begin (cdr s)
env #f))
((eq? (car s) 'define) (m-define s env))
((m-getdef (car s) env) ; interpreted fn
(m-apply (m-getdef (car s) env)
(map (lambda (x) (m-eval x env))
(cdr s))
env))
((m-compiled? (car s)) ; compiled fn
(apply (eval (car s))
(map (lambda (x) (m-eval x env))
(cdr s))))
(t (m-error "Undefined fn " (car s)))))
Contents    Page-10    Prev    Next    Page+10    Index