Implement 5.23
This commit is contained in:
@@ -95,6 +95,49 @@
|
||||
(scan (frame-variables frame)
|
||||
(frame-values frame))))
|
||||
|
||||
;;; cond-support
|
||||
(define (cond? exp) (tagged-list? exp 'cond))
|
||||
(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 (cond->if exp)
|
||||
(expand-clauses (cond-clauses exp)))
|
||||
|
||||
(define (expand-clauses clauses)
|
||||
(if (null? clauses)
|
||||
'false ; 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))
|
||||
(make-if (cond-predicate first)
|
||||
(sequence->exp (cond-actions first))
|
||||
(expand-clauses rest))))))
|
||||
|
||||
;;; lambda-support
|
||||
|
||||
;;; let-support
|
||||
(define (let? exp) (tagged-list? exp 'let))
|
||||
(define (let-bindings exp) (cadr exp))
|
||||
(define (let-body exp) (cddr exp))
|
||||
(define (let-binding-var binding) (car binding))
|
||||
(define (let-binding-exp binding) (cadr binding))
|
||||
(define (let-vars exp) (map let-binding-var (let-bindings exp)))
|
||||
(define (let-exps exp) (map let-binding-exp (let-bindings exp)))
|
||||
|
||||
(define (make-lambda parameters body)
|
||||
(cons 'lambda (cons parameters body)))
|
||||
|
||||
(define (let->combination exp)
|
||||
(let ((let-variables (let-vars exp))
|
||||
(let-expressions (let-exps exp)))
|
||||
(cons (make-lambda let-variables (let-body exp))
|
||||
let-expressions)))
|
||||
|
||||
;;;SECTION 4.1.4
|
||||
|
||||
|
||||
Reference in New Issue
Block a user