莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          sicp 4.3.3小節習題

          Posted on 2008-11-21 10:26 dennis 閱讀(1558) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎

              本節實現了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))))


          主站蜘蛛池模板: 青田县| 宁强县| 万山特区| 黄大仙区| 凤山市| 固始县| 富蕴县| 新郑市| 彭阳县| 太谷县| 确山县| 中牟县| 登封市| 南乐县| 鲁山县| 修水县| 葫芦岛市| 泰和县| 辽宁省| 太原市| 漾濞| 江口县| 思茅市| 广昌县| 铜鼓县| 女性| 冷水江市| 枣阳市| 汉中市| 彭泽县| 犍为县| 辛集市| 贵阳市| 南开区| 松江区| 乐平市| 南阳市| 渑池县| 新密市| 阳信县| 普宁市|