SICP Practice

Practice 4.4

(define (eval-and exp env) (let ((seq (cdr exp))) (cond ((null? seq) #t) ((not (eval (car seq) env)) #f) (else (eval-and (cons (car exp) (cddr exp))))))))

(define (eval-or exp env) (let ((seq (cdr exp))) (cond ((null? seq) #f) ((eval (car seq) env) #t) (else (eval-or (cons (car exp) (cddr exp)))))))

(put ‘eval ‘and eval-and) (put ‘eval ‘or eval-or)

(define (and->if exp) (expand-and-cond-clauses (cond-clauses exp)))

(define (expand-and-cond-clauses clauses) (if (null? clauses) #t (make-if (cond-predicte (car clauses)) #f (expand-and-cond-clauses (cdr clauses)))))

(define (or->if exp) (expand-or-cond-clauses (cond-clauses exp)))

(define (expand-or-cond-clauses clauses) (if (null? clauses) #f (make-if (cond-predicte (car clauses)) #t (expand-or-cond-clauses (cdr clauses)))))