#lang scheme (define (eval exp ambiente) (if (number? exp) exp (if (symbol? exp) (assoc exp ambiente) (if (equal? (car exp) 'quote) (cadr exp) (apply-op (car exp) (eval (cadr exp) ambiente) (eval (caddr exp) ambiente)))))) (define (apply-op f x y) (if (equal? f '+) (+ x y) (if (equal? f '-) (- x y) (if (equal? f '/) (/ x y) (if (equal? f '*) (* x y) 'erro))))) ;abaixo as funções auxiliares (define (assoc chave lista) (if (null? lista) (error 'symbolNotFound) (if (equal? chave (caar lista)) (cadar lista) (assoc chave (cdr lista))))) (define (mkassoc chave valor lista) (if (null? lista) (list (list chave valor)) (if (equal? chave (caar lista)) (cons (list chave valor ) (cdr lista)) (cons (car lista) (mkassoc chave valor (cdr lista)))))) (define (emptyassoc)'()) (define (atom? x) (if (null? x) #t (not (list? x)))) (define (equal? e1 e2) (if (and (atom? e1) (atom? e2)) (eq? e1 e2) (if (or (atom? e1) (atom? e2)) #f (and (equal? (car e1) (car e2)) (equal? (cdr e1) (cdr e2))))))