sicp 4.3.3小节习题

    xiaoxiao2024-04-07  145

    本节实现了amb求值器,题目都是扩展这个求值器,引入一些特殊的过程。我的尝试解答从4.51开始 习题4.51,要求实现permanent-set!,这个过程的副作用在遇到失败时不撤销,实现如下: ;扩充analyze  ((permanent - assignment? exp)          (analyze - permanent - assignment exp)) ;实现 (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)))) 习题4.52,实现if-fail的特殊形式,在第一个表达式如果求值成功,就返回该表达式的值,否则返回第二个表达式的值,实现如下: ;扩充analyze  (( if - fail? exp)          (analyze - if - fail exp)) ;实现 (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如果执行成功,就返回结果pred-value,否则就执行fail过程 ( lambda () (cproc env succeed fail)),测试略。 习题4.53,根据题意可知这个过程返回结果应该是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有结果,执行也是如此: ;;; AMB - Eval value: (( 8   35 ) ( 3   110 ) ( 3   20 )) 习题4.54,将require实现为特殊形式: ;扩充analyze ((require? exp)          (analyze - require exp)) ;实现 (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)))) 文章转自庄周梦蝶  ,原文发布时间2008-11-21 相关资源:sicp第二章练习题的解答
    最新回复(0)