SICP 习题 2.3 要求我们实现一种平面矩形的表示,定义获取数据的相关选择函数。然后定义几个过程来计算矩形的周长和面积。
接着题目还要求我们实现矩形的另一种表示方式,要求这个新的矩形表示方式同样适用于以上定义的周长和面积计算过程。
有关这道题我们可以通过由上而下的方式进行实现,实现过程也不算复杂,原因是这道题涉及到的数学概念还是比较简单,就是矩形的面积和周长,差不多是我们小学的知识吧。不过题目后面要求我们实现矩形的不同表示方式,还要同时支持同一个计算周长和面积的过程,这点有些麻烦,实际上这道题有点偷跑了,涉及到的一些概念在本书的后面章节中才详细讲到。如果只是使用我们目前学习过的一些Scheme技术,实际上无法妥善的完成这道题目,只能部分实现。
我们先从最上层开始实现,首先是面积计算过程和周长计算过程。
面积计算过程就是“长乘以宽”嘛,代码如下:
(define (area-rect rect)
(* (get-length rect) (get-width rect)))
周长计算过程就是“长加上宽,然后乘以2”,代码如下:
(define (perimeter-rect rect)
(* 2 (+ (get-length rect) (get-width rect))))
通过以上过程我们就可以发现,我们需要实现的是get-length和get-width两个过程,用于获取一个矩形的长和宽。
具体的get-length和get-width如何实现,又取决于我们的矩形数据结构如何实现。
我在下面列出我的第一种实现,实现的方式是通过矩形的两个顶点的坐标来定义一个矩形,代码如下: