sicp 2.4节小题尝试解答
2.4 尝试 解答
2023-09-11 14:16:04 时间
这一节那是相当的有趣,抽象数据的多重表示:采用标志(tag)来区分和数据导向(data-directed)技术,稍微提了下消息传递。通过一张二维表格将类型、操作的分派机制介绍的很清楚,静态OO语言正是通过类型来决定消息的分派,而消息传递以列进行划分,每个类型都以过程来表征,也就是所谓的“智能数据对象”,两者各有优缺点。当类型增加频繁时,消息传递风格的分派更容易扩展,当操作增加频繁时,反而是显式的类型分派更为容易扩展,这一点如果有OO设计经验应该很容易体会。
看看习题:
习题2.73,将求导程序以数据导向方式进行修改:
a)题目已经说了,基于被求导表达式的类型进行分派,加法表达式或者乘法表达式都有标志来区分,而number?和variable?并没有标志进行区分,因此无法加入数据导向分派。
b)选择函数不变,将求导过程提取出来,根据表达式类型划分,然后用put过程安装:
(define (deriv-sum exp var)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
(define (deriv-prod exp var)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
(define (install-deriv-package)
(put deriv + deriv-sum)
(put deriv * deriv-prod)
done) c)我没做,不过和b差不了多少
习题2.75,很简单,跟着书上来:
(define (make-from-mag-ang r a)
(define (dispatch op)
(cond ((eq? op real-part) (* r (cos a)))
((eq? op imag-part) (* r (sin a)))
((eq? op magnitude) r)
((eq? op angle) a)
(else
display "Unknow op")))
dispatch)
看看习题:
习题2.73,将求导程序以数据导向方式进行修改:
a)题目已经说了,基于被求导表达式的类型进行分派,加法表达式或者乘法表达式都有标志来区分,而number?和variable?并没有标志进行区分,因此无法加入数据导向分派。
b)选择函数不变,将求导过程提取出来,根据表达式类型划分,然后用put过程安装:
(define (deriv-sum exp var)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
(define (deriv-prod exp var)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
(define (install-deriv-package)
(put deriv + deriv-sum)
(put deriv * deriv-prod)
done) c)我没做,不过和b差不了多少
习题2.75,很简单,跟着书上来:
(define (make-from-mag-ang r a)
(define (dispatch op)
(cond ((eq? op real-part) (* r (cos a)))
((eq? op imag-part) (* r (sin a)))
((eq? op magnitude) r)
((eq? op angle) a)
(else
display "Unknow op")))
dispatch)
将极角坐标系表示的复数用dispatch过程来表示,这正是消息传递风格。
习题2.76,在本文开头已经提了。
文章转自庄周梦蝶 ,原文发布时间 2007-07-20
相关文章
- 树莓派Pico + MicroPython驱动2.4寸SPI串口屏(ST7789)
- CareerCup-2.4
- NUnit 2.4.1简体中文版。欢迎大家下载
- Linux系统安装Apache 2.4.6
- spring boot单元测试之十五:用mockmvc测试返回异步结果的controller(spring boot 2.4.4)
- spring boot单元测试之十一:给带有filter的controller做单元测试(spring boot 2.4.4)
- linux下安装apache(httpd-2.4.3版本)各种坑
- spring boot单元测试之十:用embedded-redis库做Redis的mock(spring boot 2.4.3)
- Atitit 高性能架构法艾提拉著作 目录 1. 前期可以立即使用的技术2 2. 分离法3 2.1. Web db分离3 2.2. 读写分离4 2.3. CDN加速技术4 2.4. 动静分
- 习题 2.4(6) 将100~200之间的素数输出。
- 习题 2.4(3) 有3个数a, b, c,要求按大小顺序把它们输出。
- 008-Centos 7.x安装 Ambari 2.2.2 + HDP 2.4.2 搭建Hadoop集群
- Apache 2.4虚拟主机配置
- 嵌入式linux开发,opencv移植,opencv-2.4.9移植,cmake-gui