SICPゼミ第41回

練習問題4.4
(define (eval-and exp env)
  (cond
    ((null? exp) #t)
    ((null? (cdr exp)) (eval (cdr exp) env))
    ((not (eval (car exp) env)) #f)
    (else (eval-and (cdr exp) env))))

(define (and? exp) (tagged-list? exp 'and))

by dolicas

派生式の方もできた

(define (vars exp))
(define (and->if exp)
  (make-if (null? (vars exp))
                 #t
                 (make-if (car (vars exp))
                                (and-if ('and (cdr (vars exp)))
                                false))

by ぷに

練習問題4.5
(define (expand-clauses clauses)
    (if (null? clauses)
'false ;
(let ((first (car clauses))
    (rest (cdr clauses)))
(if (cond-else-clause? first)
    (if (null? rest)
        (sequence->exp (cond-actions first))
        (error "ELSE clause isn't last: COND->IF"
            clauses))
    (make-if (cond-predicate first)
        (if (cond-test? (cond-actions first))
            ((eval (cdr cond-actions) env) (eval cond-predicate env))
            (sequence->exp (cond-actions first)))
        (expand-clauses rest))))))

(define (cond-test? clause) 
    (= (cond-predicate clase) '=>))

と変更する

by dolicas

練習問題4.6
(define (let->combination exp)
    (let ((defs (let-defs exp)))
    ((make-lambda (let-variable-from-defs defs) (let-body exp))
     (let-defbody-from-defs defs))))
(define (let-defs exp)
    (cadr exp))
(define (let-body exp)
    (caddr exp))
(define (let-variable-from-defs defs)
        (if (null? defs)
            '()
            (cons (caar defs) (let-variable-from-defs (cdr defs)))))
(define (let-defbody-from-defs defs)
        (if (null? defs)
            '()
            (cons (cdar defs) (let-variable-from-defs (cdr defs)))))