sicp 4.3.3小节习题

简介:
  本节实现了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
目录
相关文章
|
6月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计(第五版)谭浩强
117 1
|
6月前
|
存储 移动开发 C语言
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
# C程序设计内容与例题讲解 -- 第三章第一部分(第五版)谭浩强
|
6月前
|
C语言 数据格式
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第三部分(第五版)谭浩强
|
6月前
|
存储 C语言
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第三章第二部分(第五版)谭浩强
|
5月前
|
IDE 编译器 开发工具
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
42 0
|
6月前
|
C语言
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强
|
机器学习/深度学习 存储 人工智能
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
|
存储 编译器 程序员
第八章 数组《C语言程序设计现代方法(第2版)》读书笔记
我们所见的变量都只是 标量(scalar ):标量具有保存单一数据项的能力。C语言也支持 聚合 (aggregate )变量,这类变量可以存储一组一组的数值。在 C 语言中一共有两种聚合类型: 数组 (array)和结构(structure )。
第八章 数组《C语言程序设计现代方法(第2版)》读书笔记
|
Java
java编程思想第四版第十一章习题
运行结果分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。
212 0