习题3.6,我的实现如下:
(define rand
(let ((x 3))
(lambda(arg)
(cond((eq? arg 'generate)
((lambda()(set! x (rand-update x)) x)))
((eq? arg 'reset)
(lambda(init) (set! x init) (set! x (rand-update x)) x))
(else
error "Unkonown OP")))))
简单解释下,当参数是generate时,直接调用匿名lambda函数(lambda()(set! x (rand-update x)) x) ,最后返回随机值。而当第一个参数是reset时,返回匿名函数(lambda(init) (set! x init) (set! x (rand-update x)) x),这个匿名函数接受一个新的初始值,并赋值给x,然后调用rand-update
习 题3.7,引入赋值的代价就是引入了副作用以及相应的复杂性,3.3小节提出了命令式语言与函数式语言的基本差别。这一题,首先修改习题3.3(参见 《sicp 3.1小结习题尝试解答》),增加一个检查密码是否正确的功能,用以检查输入的原始帐户密码是否正确,make-account修改一下
;习题3.3
(define (make-account2 balance passwd)
(define (checkpwd pwd)
(eq? pwd passwd))
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount)) balance)
"余额不足"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch pwd m)
(if (eq? pwd passwd)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
((eq? m 'checkpwd) checkpwd)
(else
(error "Unknow request--MAKE-ACCOUNT" m)))
(lambda(x) "Incorrect password")))
dispatch)
那么,make-joint可以写为:
(define (make-joint account-name account-pass new-pass)
(if (account-name 'checkpwd account-pass)
(lambda (passwd m)
(if (eq? new-pass passwd)
(account-name account-pass m)
(error "Incorrect password")))
(error
"Incorrect password to the original account")))
首先是检查原始帐户的密码是否正确,正确返回匿名函数(两个参数passwd m),此匿名函数检查密码以及调用原始帐户操作;如果不正确就提示消息。
测试一下:
> (define dennis-acc (make-account2 100 '123))
> (define zane-acc (make-joint dennis-acc '123 'abc))
> ((dennis-acc '123 'withdraw) 10)
90
> ((zane-acc 'abc 'withdraw) 10)
80
>
习题3.8,这一题比较简单了,在内部维持一个状态变量即可
(define f
(let ((y 1))
(lambda(x) (set! y (* x y)) y)))
测试可知,在(f 1) (f 0)执行的顺序不同时,返回的值不同。
分享到:
相关推荐
UCB CS61a SICP Python 描述 原文: 译者: 协议: 前面是山,我们就爬山;前面是海,我们就渡海;前面是皇宫,我们就开炮!——《龙族前传》 下载 Docker docker pull apachecn0/sicp-py-zh docker run -tid -p ...
资源分类:Python库 所属语言:Python 资源全名:sicp-0.0.2-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
sicp-in-python(中文版+英文版)PDF 背景. SICP 全称Structure and Interpretation of Computer Programs,翻译过来叫《计算机程序的构造和解释》使用python
《计算机程序的构造和解释》(SICP)是一本极具影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman所著,MIT出版社出版。这本书以其深入探讨编程概念、程序设计方法以及计算机系统的工作原理而闻名。1-3...
以上就是基于文件名推测的SICP第二章练习题相关知识点。这些内容深入地涵盖了函数式编程的基础和应用,对于提升编程思维和技能大有裨益。实际的学习过程中,通过阅读和理解这些代码,结合原书的理论部分,将有助于...
NUS CS1101s SICP JavaScript 描述原文:协议:如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。——David Leinweber贡献指南本项目需要校对,欢迎大家提交 Pull Request。...
在SICP上进行试用-> WASM编译演示:SICP如何将机器代码注册为WASM 为阶乘翻译LISP代码(define (factorial n) (define (iter product counter) (if (> counter n) product (iter (* counter product) (+ counter 1)))...
《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...
运用激光熔覆技术在AISI1045钢表面制备了30vol-% SiCp/Ni-Cr-B-Si-C涂层。SEM和TEM观察分析表明:SiCp在熔覆过程中完全溶解;涂层结合区组织为共晶结构;涂层组织由初生石墨球G,分布在γ-Ni固溶体枝晶中的M23(C,B)6...
为研究SiCP/Al-Fe-V-Si复合材料的热稳定性,对多层喷射沉积技术制备的SiC颗粒增强Al-Fe-V-Si合金经过不同温度下的热稳定性实验后进行了硬度检测,并对其显微组织进行了电镜观察。结果表明:随着基体合金材料中Fe含量的...
本文将围绕"Sicp-eg-ex"这个项目,结合标题和描述,探讨在学习SICP过程中遇到的例子、笔记和习题解,特别是环境检查方案9.5的相关知识点。 首先,我们关注到的是"SICP课程视频示例"。SICP课程的核心在于通过实际的...
《SICP Python》是基于加州大学伯克利分校(UCB)计算机科学61A课程(CS61A)的“Structure and Interpretation of Computer Programs”(SICP)的经典教材的Python语言版本。SICP是一本极具影响力的计算机科学教科...
采用粉末冶金法制备 SiCp/Al-Si复合材料,以 CeO2 为变质剂,制备含 CeO2 的 SiCp/Al-Si 复合材料。研究 CeO2 的添加量(质量分数)对复合材料组织和力学性能的影响,探讨复合材料中 CeO2 在烧结过程中的作用机理。研究...
《计算机程序结构和解释》(SICP)是一本经典的计算机科学教材,由Harold Abelson和Gerald Jay Sussman合著,并由MIT出版社出版。这个“sicp-study-group”项目显然是一个围绕该书的学习社区,旨在深入探讨编程语言...
CoRecursive Slack SICP研究小组 章节 1-1-1 ::表达式 1-1-2 ::命名与环境 1-1-3 ::评估组合 1-1-4 ::复合程序 1-1-5 ::程序应用的替代模型 1-1-6 ::条件表达式和谓词 1-1-7 ::例子:牛顿法求平方根 1-1-8 :...
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
最终目标是完全支持SICP指令集,然后使用此编译器将Scheme编译为Z80,或直接将Scheme编写为Z80。 无论哪种方式,该项目对我来说也意味着可以在TI-84(不是最好的语言)上探索Z80装配中的编程。特征显示字符串和数字...
SICP-Python版本