SICP Exercise 4.5

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

你可能感兴趣的:(SICP Exercise 4.5)