(load "evaluator.txt") ; Save the base eval so the extend eval can make use of it. (define base-eval eval) (define (and? exp) (tagged-list? exp 'and)) (define (eval-and exp env) (define (iter expressions) (let ((value (eval (car expressions) env)) (rest (cdr expressions))) (cond ((null? rest) value) ((false? value) false) (else (iter rest))))) (if (null? (operands exp)) true (iter (operands exp)))) (define (or? exp) (tagged-list? exp 'or)) (define (eval-or exp env) (define (iter expressions) (if (null? expressions) false (let ((value (eval (car expressions) env))) (if (true? value) value (iter (cdr expressions)))))) (iter (operands exp))) ; Extended eval (define (eval exp env) (cond ((and? exp) (eval-and exp env)) ((or? exp) (eval-or exp env)) (else (base-eval exp env)))) ; 1 ]=> (define the-global-environment (setup-environment)) ; ; ;Value: the-global-environment ; ; 1 ]=> (driver-loop) ; ; ; ;;; M-Eval input: ; (and) ; ; ;;; M-Eval value: ; #t ; ; ;;; M-Eval input: ; (and 1 2 3 4) ; ; ;;; M-Eval value: ; 4 ; ; ;;; M-Eval input: ; (and 1 false (display "hi")) ; ; ;;; M-Eval value: ; #f ; ; ;;; M-Eval input: ; (or) ; ; ;;; M-Eval value: ; #f ; ; ;;; M-Eval input: ; (or false (and 1 false (display "bye")) (begin (display "hi") 2)) ; hi ; ;;; M-Eval value: ; 2 ; ; ;;; M-Eval input: ; (or false false (or (> 1 3) (< 3 1))) ; ; ;;; M-Eval value: ; #f