(define mem (lambda (a ls) (cond ((null? ls) #f) ((eq? a (car ls)) #t) (else (mem a (cdr ls)))))) (define remove-all (lambda (ls1 ls2) (cond ((null? ls1) ls2) (else (remove-all (cdr ls1) (remq (car ls1) ls2)))))) (define append-all (lambda (lss) (cond ((null? lss) '()) (else (append (car lss) (append-all (cdr lss))))))) (define get-depth (lambda (a lss) (cond ((memq a (car lss)) 0) (else (+ 1 (get-depth a (cdr lss))))))) (define get-offset (lambda (a lss) (letrec ((h (lambda (ls pos) (cond ((null? ls) -1) ((eq? a (car ls)) pos) (else (h (cdr ls) (+ pos 1))))))) (let ((pos (h (car lss) 0))) (if (= pos -1) (get-offset a (cdr lss)) pos))))) (define numlist? (lambda (ls) (cond ((null? ls) #t) ((number? ls) #t) ((atom? ls) #f) (else (and (numlist? (car ls)) (numlist? (cdr ls))))))) (define building-exp (lambda (ls) (cond ((null? ls) ''()) ((number? ls) ls) (else (list 'cons (building-exp (car ls)) (building-exp (cdr ls))))))) (define aexp? (lambda (exp) (cond ((number? exp) #t) ((and (list? exp) (= (length exp) 3)) (case (car exp) ((+ - * /) (and (aexp? (cadr exp)) (aexp? (caddr exp)))) (else #f))) (else #f)))) (define eval-ae (lambda (exp) (cond ((number? exp) exp) ((atom? exp) (error 'eval-ae "invalid expression ~s" exp)) ((not (= (length exp) 3)) (error 'eval-ae "invalid expression ~s" exp)) (else (case (car exp) ((+) (+ (eval-ae (cadr exp)) (eval-ae (caddr exp)))) ((-) (- (eval-ae (cadr exp)) (eval-ae (caddr exp)))) ((*) (* (eval-ae (cadr exp)) (eval-ae (caddr exp)))) ((/) (/ (eval-ae (cadr exp)) (eval-ae (caddr exp)))) (else (error 'eval-ae "invalid expression ~s" exp)))))))