(define (mEval Expr) ;; (display "Eval: ") (display Expr) (newline) (cond [(null? Expr) '()] [(number? Expr) Expr] [(eq? (car Expr) 'if) (mEvalIf (cadr Expr) (caddr Expr) (cadddr Expr))] [(eq? (car Expr) 'quote) (cadr Expr)] [else (mApply (car Expr) (mEvalList (cdr Expr)))] ) ) (define (mApply Op Args) ;; (display "mApply: ") (display Op) (display " : ") (display Args) (newline) (case Op [(car) (caar Args)] [(cdr) (cdar Args)] [(cons) (cons (car Args) (cadr Args))] [(eq?) (eq? (car Args) (cadr Args))] [(null?) (null? (car Args))] [(+) (+ (car Args) (cadr Args))] [(*) (* (car Args) (cadr Args))] ) ) (define (mEvalIf b t e) (if (mEval b) (mEval t) (mEval e)) ) (define (mEvalList List) ;; (display "mEvalList: ") (display List) (newline) (cond [(null? List) '()] [else (cons (mEval (car List)) (mEvalList (cdr List)))] ) ) (define (test Expr) (begin (display "> ") (display "(mEval ") (display Expr) (display ")") (newline) (display (mEval Expr)) (newline) ) ) (define (test1) (test '(+ 1 2))) (define (test2) (test '(+ 1 (* 3 4)))) (define (test3) (test '(quote (2 3)))) (define (test4) (test '(car (quote (1 2))))) (define (test5) (test '(cdr (quote (1 2))))) (define (test6) (test '(cons (quote 5) (quote (1 2))))) (define (test7) (test '(null? (quote (1 2))))) (define (test8) (test '(null? (quote ())))) (define (test9) (test '(if (eq? 1 1) 5 6))) (define (testA) (test '(begin 1 2))) (define (testB) (test '(display 1))) (define (testC) (test '(newline))) (define (testD) (test '(begin (display 1) (newline)))) (define (testE) (test '(begin (display 55) (newline) (display 66) (newline) (+ 4 5)))) (define (testF) (test '(begin (+ 1 2) (* 2 3)))) (define (testG) (test '(equal? 1 1))) (define (testH) (test '(equal? 1 2))) (define (testI) (test '(equal? (quote (1 2)) (quote (1 2))))) (define (testJ) (test '(equal? (quote (1 (2))) (quote (1 (2)))))) (define (testK) (test '(equal? (quote (1 (2) 3)) (quote (1 (2) (3)))))) (define (testL) (test '(cond ((eq? 1 1) (display 1))))) (define (testM) (test '(cond ((eq? 1 2) 44) ((equal? (quote (1 2)) (quote (1 (2)))) 55) (#t 66)) ))