sicp 3.1.1小节习题尝试解答
这一节主要是介绍局部状态变量,介绍了set!和begin的语法,看来ruby使用!号来表示改变变量值不是什么新鲜主意。
习题3.1,不解释了
;习题3.1
(define (make-accumulator init)
(define (accumulator num)
(set! init (+ init num))
init)
accumulator)
习题3.2,非常有趣的例子,在内部维持一个计数的变量即可,如果传入的参数是特定的符号就返回计数或者清0,如果不是,原过程调用。
;习题3.2
(define (make-monitored proc)
(let ((counter 0))
(define (proc-monitor args)
(cond ((eq? args 'how-many-calls?) counter)
((eq? args 'reset-count) (begin (set! counter 0) counter))
(else
(begin (set! counter (+ counter 1)) (proc args)))))
proc-monitor))
请注意,我的实现只能针对有一个参数的过程,对于多个参数的过程我还不知道怎么做。
习题3.3,passwd的局部状态变量,在dispatch前比较下传入的密码是否与之一致
;习题3.3
(define (make-account balance 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)
(else
(error "Unknow request--MAKE-ACCOUNT" m)))
(lambda(x) "Incorrect password")))
dispatch)
不一致的时候,返回一个匿名过程,仅仅是输出消息Incorrect password
习题3.4,在内部维持一个局部变量counter,用于计数密码错误的次数,在dispatch前判断counter是否等于7,如果是7就调用过程call-the-cops。
;习题3.4
(define (make-account balance passwd)
(let ((counter 0))
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount)) balance)
"余额不足"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (call-the-cops amount)
"您已经尝试输入密码7次了!不能再试!")
(define (dispatch pwd m)
(cond ((= 7 counter) call-the-cops)
((eq? pwd passwd)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else
(error "Unknow request--MAKE-ACCOUNT" m))))
(else
(begin (set! counter (+ counter 1)) (lambda(x) "Incorrect password")))))
dispatch))
文章转自庄周梦蝶 ,原文发布时间2007-07-24
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的