
程序设计技术和方法
裘宗燕,2009-2010 -1-
2. 构造数据抽象(2)
本节讨论
数据抽象和操作的实例:一个图形语言
符号数据(与数值数据对应)
符号表达式的处理(计算,符号计算)
抽象数据的多重表示
数据导向的程序设计
消息传递
程序设计技术和方法
裘宗燕,2009-2010 -2-
一个图形语言
以一个构造图形的简单语言为例,展示数据抽象和闭包的作用和威力
其中高阶过程扮演了关键性的角色
主要功能:构造具有重复性元素的图形,元素按规则变形变大小
两个这种图形的例子:
像 Escher 画的图(当然,远没那些画复杂,也没那么深刻)
程序设计技术和方法
裘宗燕,2009-2010 -3-
图形语言:基本想法
基本元素:painter。一个 painter 画出一种特定图像
可根据要求对所画图像进行操作(改变大小和变形)
画出的图像依赖于具体框架。如:
组合图像的方式:(假设定义了各种组合操作,具体实现见后)
beside 使用两个 painter,让它们分别在左右半区域画图
below 使用两个 painter,让它们分别在上下半区域画图
flip-vert 使用一个 painter,画出上下反转后的图
flip-hozil 使用一个 painter,画出左右反转后的图
wave 画的图 rogers 画的图
程序设计技术和方法
裘宗燕,2009-2010 -4-
图形语言:组合
一个或几个 painter 组合起来还是 painter
(define wave2 (beside wave (flip-vert wave)))
(define wave4 (below wave2 wave2))
应该考虑 painter 的重要组合模式,并将其实现为Scheme过程
例如,抽象出 wave4 里的模式:
(define (flipped-pairs painter)
(let ((painter2 (beside painter (flip-vert painter))))
(below painter2 painter2)))
(define wave4 (flipped-pairs wave))
可能从一个过程
抽取出多个不同
的模式
如对 wave4,可
考虑将反转方式
抽取出来作为过
程参数
可有其他考虑
定义好的操作可用
于任何painter
- 1
- 2
前往页