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)))))))