;;; Simple constant (Scheme) expression evaluator. ;;; (mc-eval exp) returns the result of evaluating the constant expression exp ;;; (define (mc-eval exp) (cond ((constant? exp) exp) ((conditional? exp) (eval-if exp)) ((application? exp) (mc-apply (operator exp) (map mc-eval (operands exp)))) (else (error "invalid expression" exp)))) ; Constants: number ; (define constant? number?) ; Conditionals: ('if condition consequent alternative) ; (define (conditional? exp) (and (pair? exp) (eq? (car exp) 'if))) (define condition cadr) (define consequent caddr) (define alternative cadddr) (define (eval-if exp) (if (mc-eval (condition exp)) (mc-eval (consequent exp)) (mc-eval (alternative exp)))) ; Applications (procedure calls): (operator operand ... ) ; (define application? pair?) (define operator car) (define operands cdr) ;;; (mc-apply proc args) returns the result of applying procedure proc ;;; to arguments args. (define (mc-apply proc args) (cond ((equal? proc '+) (apply + args)) ((equal? proc '*) (apply * args)) ((equal? proc '=) (eq? (car args) (cadr args))) (else (error "invalid procedure for ap" proc)))) ; User interface: (mc-scheme) ; (define (mc-scheme) (display "mc-eval1==> ") (display (mc-eval (read))) (newline) (mc-scheme)) ;;; eof