; Funciones de listas ; (member a l) retorna la sublista que contiene a o #f (define (member a l) (if (null? l) #f (if (equal? a (car l)) l (member a (cdr l)) ))) ; (append l1 l2) concatena listas (define (append l1 l2) (if (null? l1) l2 (cons (car l1) (append (cdr l1) l2)) )) ; (reverse l) invierte lista (define (reverse l) (if (null? l) '() (append (reverse (cdr l)) (cons (car l) '())) )) ; Evaluador de expresion de arbol ; expresiones binarias como '(+ (* 1 2) 3) (define (evtree expr) (if (null? expr) (error "Bad Expr ~S" expr) (cond ((number? expr) expr ) ((symbol? (car expr)) ((eval (car expr)) (evtree (cadr expr)) (evtree (caddr expr))) ) (else (error "Bad Expr ~S" expr) )))) ; Evaluador de prefijo ; expresiones como '(+ * 1 2 3) (define (evpref expr) (define (recpref) (let ((aux 0)) (if (null? expr) (error "Bad Expr") (cond ((number? (car expr)) (set! aux (car expr)) (set! expr (cdr expr)) aux ) ((symbol? (car expr)) (set! aux (car expr)) (set! expr (cdr expr)) ((eval aux) (recpref) (recpref)) ) (else (error "Bad Expr") ))))) (recpref) ) ;; Imprime en infijo expresiones de prefijo (define (dtree expr) (if (null? expr) (error "Bad Expr ~S" expr) (cond ((number? expr) (display expr) ) ((symbol? (car expr)) (display "(") (dlist (car expr) (cdr expr)) (display ")") ) (else (error "Bad Expr ~S" expr) )))) (define (dlist op largs) (dtree (car largs)) (if (pair? (cdr largs)) (begin (display op) (dlist op (cdr largs)) ))) ;; Imprime en infijo expresiones de prefijo ;; Sin parentesis superfluos (define (dptree expr) (define (dptreein expr op) (if (null? expr) (error "Bad Expr ~S" expr) (cond ((number? expr) (display expr) ) ((symbol? (car expr)) (if (not (eq? (car expr) op)) (display "(") ) (dplist (car expr) (cdr expr)) (if (not (eq? (car expr) op)) (display ")") )) (else (error "Bad Expr ~S" expr) )))) (define (dplist op largs) (dptreein (car largs) op) (if (pair? (cdr largs)) (begin (display op) (dplist op (cdr largs)) ))) (dptreein expr ()) (newline) )