2015/12/18

SICP 問題 4.05

make-ifに渡す前にclauseをpredicateとactionにわかる. (car action)に'=>があれば(cadr action)にpredicateを適用する.

(define (expand-clauses clauses)
  (if (null? clauses)
      'false ;; else 説は無い
      (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))
            (let ((predicate (cond-predicate first))
                  (action (cond-action first)))
              (make-if (cond-predicate first)
                       (if (eq? (car action) '=>)
                           ((cadr action) predicate)
                           (sequence->exp action))
                       (expand-clauses rest)))))))

© 2022 wat-aro