这个作业的任务是对二维几何对象解释器的功能进行扩展。SML的功能基本上已经完成了,而Ruby的部分还没有完成。SML是通过函数+模式匹配来实现的。而Ruby是通过类+方法来实现的,包括了一些费脑的double dispatch和其他的dynamic dispatch,即OOP的风格。
语法:
5种数据类型+4种表达式。
5种数据类型分别是NoPoints, Point, Line(infinite), VerticalLine(x=?), LineSegment(finite, include four points)
4种表达式分别是Intersect, Let, Var, Shift。
Intersect(包括两个子表达式,求两个表达式的交点)。
Let和Var是SML中常用的两个表达式。
Shift(偏移表达式)。
关于浮点数相等的说明,如果两个浮点数的差值的绝对值小于0.00001,则认为这两个数相等。
表达式的预处理
等效表达式:
1.在LineSegment中,应该没有坐标相同的点。
2.在LineSegment中,左端点的x值应该比较小。如果两个端点的x值很接近,则左端点的y值应该比较小。
SML代码
添加预处理和Shift表达式。