Код Ревью
Сравни свои решения
#| BEGIN (Write your solution here) |#
(define (cond->if exp)
(expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
(if (null? clauses)
'false
(let ((first (car clauses))
(rest (cdr clauses)))
(cond ((cond-else-clause? first)
(if (null? rest)
(sequence->exp (cond-actions first))
(error "ELSE clause isn't last -- COND->IF"
clauses)))
((cond-arrow-clause? first)
(make-if (cond-arrow-test first)
((cond-arrow-recipient first) (cond-arrow-test first))))
(else
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest)))))))
(define (cond-arrow-clause? clause)
(and (not (null? (cdr clause)))
(eq? (cadr clause) '=>)))
(define (cond-arrow-test clause)
(car clause))
(define (cond-arrow-recipient clause)
(caddr clause))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
(eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))
(define (make-if predicate consequent alternative)
(list 'if predicate consequent alternative))
(define (cond? exp) (tagged-list? exp 'cond))
#| END |#
#| BEGIN (Write your solution here) |#
(define (cond->if exp)
(expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
(if (null? clauses)
'false
(let ((first (car clauses))
(rest (cdr clauses)))
(cond ((cond-else-clause? first)
(if (null? rest)
(sequence->exp (cond-actions first))
(error "ELSE clause isn't last -- COND->IF"
clauses)))
((cond-arrow-clause? first)
(make-if (cond-arrow-test first)
(list (cond-arrow-recipient first)
(cond-arrow-test first))
(expand-clauses rest)))
(else
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest)))))))
(define (cond-arrow-clause? clause)
(and (not (null? (cdr clause)))
(eq? (cadr clause) '=>)))
(define (cond-arrow-test clause)
(car clause))
(define (cond-arrow-recipient clause)
(caddr clause))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
(eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))
(define (make-if predicate consequent alternative)
(list 'if predicate consequent alternative))
(define (cond? exp) (tagged-list? exp 'cond))
#| END |#
#| BEGIN (Write your solution here) |#
(define (cond->if exp)
(expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
(if (null? clauses)
'false
(let ((first (car clauses))
(rest (cdr clauses)))
(cond ((cond-else-clause? first)
(if (null? rest)
(sequence->exp (cond-actions first))
(error "ELSE clause isn't last -- COND->IF"
clauses)))
((cond-arrow-clause? first)
(make-if (cond-arrow-test first)
((cond-arrow-recipient first) (cond-arrow-test first))))
(else
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest)))))))
(define (cond-arrow-clause? clause)
(and (not (null? (cdr clause)))
(eq? (cadr clause) '=>)))
(define (cond-arrow-test clause)
(car clause))
(define (cond-arrow-recipient clause)
(caddr clause))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
(eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))
(define (make-if predicate consequent alternative)
(list 'if predicate consequent alternative))
(define (cond? exp) (tagged-list? exp 'cond))
#| END |#
#| BEGIN (Write your solution here) |#
(define (cond->if exp)
(expand-clauses (cond-clauses exp)))
(define (expand-clauses clauses)
(if (null? clauses)
'false
(let ((first (car clauses))
(rest (cdr clauses)))
(cond ((cond-else-clause? first)
(if (null? rest)
(sequence->exp (cond-actions first))
(error "ELSE clause isn't last -- COND->IF"
clauses)))
((cond-arrow-clause? first)
(make-if (cond-arrow-test first)
(list (cond-arrow-recipient first)
(cond-arrow-test first))
(expand-clauses rest)))
(else
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest)))))))
(define (cond-arrow-clause? clause)
(and (not (null? (cdr clause)))
(eq? (cadr clause) '=>)))
(define (cond-arrow-test clause)
(car clause))
(define (cond-arrow-recipient clause)
(caddr clause))
(define (cond-clauses exp) (cdr exp))
(define (cond-else-clause? clause)
(eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause))
(define (cond-actions clause) (cdr clause))
(define (make-if predicate consequent alternative)
(list 'if predicate consequent alternative))
(define (cond? exp) (tagged-list? exp 'cond))
#| END |#