sicp 4.3.3小节习题
2023-03-14 10:25:45 时间
本节实现了amb求值器,题目都是扩展这个求值器,引入一些特殊的过程。我的尝试解答从4.51开始
习题4.51,要求实现permanent-set!,这个过程的副作用在遇到失败时不撤销,实现如下:
习题4.52,实现if-fail的特殊形式,在第一个表达式如果求值成功,就返回该表达式的值,否则返回第二个表达式的值,实现如下:
习题4.53,根据题意可知这个过程返回结果应该是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有结果,执行也是如此:
习题4.54,将require实现为特殊形式:
习题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))))
((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)),测试略。((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))))))
习题4.53,根据题意可知这个过程返回结果应该是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有结果,执行也是如此:
;;; AMB-Eval value:
((8 35) (3 110) (3 20))
((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))))
((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
相关文章
- C++静态库与动态库深入研究
- Angular JS + Express JS入门搭建网站
- 程序猿你心甘情愿的做码农么?
- 15个IT技术人员必须思考的问题
- 怎么选择合适的嵌入式设计软件?
- 用便宜电脑教小朋友编程的公司如何拿到近亿投资?
- 总结三年未满的工作经历,写下自己对技术的坚持
- 【博文推荐】如何提高团队代码质量——代码审查的实践
- 【博文推荐】如何获得C语言函数起始地址和返回地址
- Ignite 2015企业技术大会,微软最全新料在这里!
- php开发中的页面跳转方法总结
- PHP生成随机密码的4种方法及性能对比
- 2012年以来GitHub上最流行的编程语言
- 双目失明的他,如何一步步成为谷歌资深工程师
- 突如其来的Visual Studio Code为何这么热门?大牛来给你深度剖析!
- 程序员必须克服的十大编程禁忌
- 你知道如何写一个框架吗?详细步骤放送
- 28个C/C++开源JSON程序库性能及标准符合程度评测
- php模拟用户自动在qq空间发表文章的方法
- 程序员如何提升自己的价值