文档章节

【SICP练习】107 练习3.8

NoMasp
 NoMasp
发布于 2015/09/08 21:47
字数 831
阅读 5
收藏 0

练习3-8

原文

Exercise 3.8. When we defined the evaluation model in section 1.1.3, we said that the first step in evaluating an expression is to evaluate its subexpressions. But we never specified the order in which the subexpressions should be evaluated (e.g., left to right or right to left). When we introduce assignment, the order in which the arguments to a procedure are evaluated can make a difference to the result. Define a simple procedure f such that evaluating

(+ (f 0) (f 1)) 

will return 0 if the arguments to + are evaluated from left to right but will return 1 if the arguments are evaluated from right to left.

分析

题目中已经说明了求解一个表达式的第一步就是求值其中的子表达式,而对于

(+ (f 0) (f 1)) 

意味着分别求解(f 0)和(f 1),可以猜测着其中有2个lambda表达式。又因为从左往右和从右往左的求值结果不同,则意味着2个lambda是嵌套的关系。

代码

(define f (lambda (first-value) (set! f (lambda (second-valua) 0)) first-value))
;Value: 

测试

(define f (lambda (first-value) (set! f (lambda (second-valua) 0)) first-value))
;Value: f

(+ (f 0) (f 1))
;Value: 1

(+ (f 1) (f 0))
;Value: 0

总结

当我们调用(f n)时,n为实参将会代替第四行的first-value,并进一步传入第二行的lambda表达式。返回的结果则是n,但与此同时又将

(lambda (second-value) 0)

赋值给过程f。而当下一次调用(f m)时,不论m为何值,都会返回0。也就是说第一次传入的n,(f n)返回值为n,以后传入的m,(f m)返回0,并且无论传入多少次m,返回值均为0。当然了,m的值并未改变。

(f 1)
;Value: 1

(f 1)
;Value: 0

(f 1)
;Value: 0

(f 1)
;Value: 0

(define m 2)
;Value: m

(f m)
;Value: 0

m
;Value: 2

同时也可以得出结论,MIT-Scheme对子表达式的求值顺序是从右至左。

练习3-7

原文

Exercise 3.7. Consider the bank account objects created by make-account, with the password modification described in exercise 3.3. Suppose that our banking system requires the ability to make joint accounts. Define a procedure make-joint that accomplishes this. Make-joint should take three arguments. The first is a password-protected account. The second argument must match the password with which the account was defined in order for the make-joint operation to proceed. The third argument is a new password. Make-joint is to create an additional access to the original account using the new password. For example, if peter-acc is a bank account with password open-sesame, then

(define paul-acc (make-joint peter-acc 'open-sesame 'rosebud))

will allow one to make transactions on peter-acc using the name paul-acc and the password rosebud. You may wish to modify your solution to exercise 3.3 to accommodate this new feature.

分析

make-joint需要有3个参数:
1.有密码保护的帐户名
2.必须与账号的密码匹配的原密码
3.新密码

而其会返回一个过程,因此在此处需要一个lambda表达式,并且其有一个参数mode和一个传入的密码参数。另外在输出错误信息的函数中也需要一个参数,即是它并不使用,只是出于兼容性的考虑,在前面的博客中我们也遇到过这种问题。

代码

(define (make-joint origin-acc old-password new-password)

  (define (display-wrong-message msg)
    (display "Incorrect password"))

  (lambda (given-password mode)
    (if (eq? given-password new-password)
        (origin-acc old-password mode)
        display-wrong-message)))
;Value: make-joint



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44618513

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
加载中

评论(0)

自己搭建练习sql语句的环境~

突然想练习下sql语句,想在网上找个环境练习下找了半天既然没有。看到了一篇博文就以这篇博文为例子搭建个环境。(用到的工具打包)链接:http://pan.baidu.com/s/1nv8y8OD 密码:o5ls Navi...

skaiser
2017/06/19
0
0
Ravi 0.18 发布,Lua 5.3 衍生编程语言

Ravi 编程语言是 Lua 5.3 的一个衍生,有限的可选静态类型,基于 LLVM 和 libgccjit 的 JIT 编译器。Ravi 的名字来自梵语的太阳。有趣的是,Lua 的前身是 Sol,它支持静态类型,Sol 是葡萄牙...

王练
2016/12/11
1.4K
2
【囚徒健身】六艺第三艺:引体向上1-5式

六艺第三艺 – 引体向上 第一式 垂直引体 找一个可抓握且很稳固的竖直物体,门框和高一点的栏杆都是上好之选。靠近物体站立, 脚尖与之保持约 8 一巧厘米的距离。以舒服的姿势抓住该物体,理...

HustWolf
2018/07/21
0
0
【书坊11月赠书福利——第二期】《“笨办法”学Python》 (第3版)

赠书活动停留了一个月,今天开始正常进行,继续每周都给大家送出最新、最好、最实用的技术书。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《“笨办法”学...

生气的散人
2014/11/18
313
0
Gluster发布说明(时间表)

Gluster发布时间表 3.8版本之前 一直到3.8版本,GlusterFS通常有3个活跃版本。随着3.6和3.7版本在对应的n+3版本发布后EOL停止支持(3.5版本已经在2016-06-14发布3.8版本时EOL停止支持),这个...

党志强
2016/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Centos7安装kafka-manager

简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作。具体支持以下内容: 管理多个集群 轻松检查群集状态(主题,消费者,...

阿dai学长
14分钟前
53
0
什么是CMake相当于'configure --prefix = DIR && make all install'?

我做cmake . && make all install cmake . && make all install 。 这有效,但安装到/usr/local 。 我需要安装到不同的前缀(例如,到/usr )。 什么是安装到/usr而不是/usr/local的cmake和m...

技术盛宴
26分钟前
41
0
学习01-html基本内容

html骨架 <!DOCTYPE html> 这句话是声明,就是告诉浏览器,请使用HTML5的标准来解析这个网页。 <head> <meta charset="UTF-8"> <title>网页的标题</title> </head> head表示网页的头部,这里......

宋_
26分钟前
19
0
This License XXX has been cancelled(Mac环境)

解决方法: 1、屏蔽idea官网443端口; 0.0.0.0 https://account.jetbrains.com:443 2、更换idea激活码 Mac下修改hosts方法: 1.打开Finder,按快捷键组合 Shift+Command+G 查找文件,输入/et...

吴伟祥
33分钟前
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部