Exercise 4.5

(cond (test => recipient))
 普通の cond に変換する
(cond (test (recipient test)))
 if に展開する。
(if test (recipient test))

と変形できるので、cond の処理は次のようになる。

(define (cond-arrow-caluse? clause)
  (eq? (cadr clause) '=>))
(define (cond-arrow-recipient clause) (caddr clause))

(define (expand-clauses clauses)
  (if (null? clauses)
      '#f                          ; no else clause
      (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))
          (if (cond-arrow-clause? first)     ; <== ココを追加した
            (make-if (cond-predicate first)
                     (list (cond-arrow-recipient first) (cond-predicate first))
                     (expand-clauses rest))
            (make-if (cond-predicate first)
                     (sequence->exp (cond-actions first))
                     (expand-clauses rest)))))))