sicp 4.3.3小節(jié)習(xí)題
Posted on 2008-11-21 10:26 dennis 閱讀(1553) 評(píng)論(0) 編輯 收藏 所屬分類: 計(jì)算機(jī)科學(xué)與基礎(chǔ)本節(jié)實(shí)現(xiàn)了amb求值器,題目都是擴(kuò)展這個(gè)求值器,引入一些特殊的過(guò)程。我的嘗試解答從4.51開(kāi)始
習(xí)題4.51,要求實(shí)現(xiàn)permanent-set!,這個(gè)過(guò)程的副作用在遇到失敗時(shí)不撤銷,實(shí)現(xiàn)如下:
;擴(kuò)充analyze
((permanent-assignment? exp)
(analyze-permanent-assignment exp))
;實(shí)現(xiàn)
(define (permanent-assignment? exp)
(tagged-list? exp 'permanent-set!))
(define (analyze-permanent-assignment exp)
(let ((var (assignment-variable exp))
(vproc (analyze (assignment-value exp))))
(lambda(env succeed fail)
(vproc env
(lambda(val fail2)
(set-variable-value! var val env)
(succeed 'ok fail2))
fail))))
((permanent-assignment? exp)
(analyze-permanent-assignment exp))
;實(shí)現(xiàn)
(define (permanent-assignment? exp)
(tagged-list? exp 'permanent-set!))
(define (analyze-permanent-assignment exp)
(let ((var (assignment-variable exp))
(vproc (analyze (assignment-value exp))))
(lambda(env succeed fail)
(vproc env
(lambda(val fail2)
(set-variable-value! var val env)
(succeed 'ok fail2))
fail))))
習(xí)題4.52,實(shí)現(xiàn)if-fail的特殊形式,在第一個(gè)表達(dá)式如果求值成功,就返回該表達(dá)式的值,否則返回第二個(gè)表達(dá)式的值,實(shí)現(xiàn)如下:
;擴(kuò)充analyze
((if-fail? exp)
(analyze-if-fail exp))
;實(shí)現(xiàn)
(define (if-fail? exp)
(tagged-list? exp 'if-fail))
(define (analyze-if-fail exp)
(let ((pproc (analyze (if-predicate exp)))
(cproc (analyze (if-consequent exp))))
(lambda(env succeed fail)
(pproc env (lambda(pred-value fail2)
(succeed pred-value fail2))
(lambda() (cproc env succeed fail))))))
pproc如果執(zhí)行成功,就返回結(jié)果pred-value,否則就執(zhí)行fail過(guò)程(lambda() (cproc env succeed fail)),測(cè)試略。((if-fail? exp)
(analyze-if-fail exp))
;實(shí)現(xiàn)
(define (if-fail? exp)
(tagged-list? exp 'if-fail))
(define (analyze-if-fail exp)
(let ((pproc (analyze (if-predicate exp)))
(cproc (analyze (if-consequent exp))))
(lambda(env succeed fail)
(pproc env (lambda(pred-value fail2)
(succeed pred-value fail2))
(lambda() (cproc env succeed fail))))))
習(xí)題4.53,根據(jù)題意可知這個(gè)過(guò)程返回結(jié)果應(yīng)該是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有結(jié)果,執(zhí)行也是如此:
;;; AMB-Eval value:
((8 35) (3 110) (3 20))
((8 35) (3 110) (3 20))
習(xí)題4.54,將require實(shí)現(xiàn)為特殊形式:
;擴(kuò)充analyze
((require? exp)
(analyze-require exp))
;實(shí)現(xiàn)
(define (require? exp)
(tagged-list? exp 'require))
(define (require-predicate exp)
(cadr exp))
(define (analyze-require exp)
(let ((pproc (analyze (require-predicate exp))))
(lambda (env succeed fail)
(pproc env (lambda(pred-value fail2)
(if (not pred-value)
(fail2)
(succeed 'ok fail2)))
fail))))
((require? exp)
(analyze-require exp))
;實(shí)現(xiàn)
(define (require? exp)
(tagged-list? exp 'require))
(define (require-predicate exp)
(cadr exp))
(define (analyze-require exp)
(let ((pproc (analyze (require-predicate exp))))
(lambda (env succeed fail)
(pproc env (lambda(pred-value fail2)
(if (not pred-value)
(fail2)
(succeed 'ok fail2)))
fail))))