SICP Exercise 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))
(if (cond-=>-clause? first)
(make-if (cond-predicate first)
(list (sequence->exp (cond-=>-actions first))
(cond-predicate first))
(expand-clauses rest))
(make-if (cond-predicate first)
(sequence->exp (cond-actions first))
(expand-clauses rest)))))))
(define (cond-=>-clause? clause)
(eq? (cadr clause) '=>))
(define (cond-=>-actions clause)
(cddr clause))
运行结果如下:
;;; M-Eval input:
(cond ((assoc 'b '((a 1) (b 2))) => cadr) (else false))
;;; M-Eval value:
2
运行提示:
1,需要在run_eval文件中加载下列文件,代码如下:
(load "apply.rkt")
(load "data_structure.rkt")
(load "representation.rkt")
(load "exercise4.3.rkt") ;;这样就可以利用数据导向的分派方式
(load "exercise4.5.rkt")
2,需要在基本过程中加入assoc和cadr:
(define primitive-procedures
(list (list 'car car)
(list 'cdr cdr)
(list 'cadr cadr)
(list 'cons cons)
(list 'null? null?)
(list '+ +)
(list 'list list)
(list 'display display)
(list 'assoc assoc)))