Rectangles, parallelograms and circles are all shapes. We support two operations on shapes:
•
Computing the area
•
Computing the perimeter
Rectangles and parallelograms use the same algorithm for computing the area, whereas they use different algorithms for computing perimeter. Also, rectangles and parallelograms both have width and height slots. We can exploit this with subclassing:
USING: accessors kernel math math.constants math.functions ;
GENERIC: area ( shape -- n )
GENERIC: perimeter ( shape -- n )
TUPLE: shape ;
TUPLE: circle < shape radius ;
M: circle area radius>> sq pi * ;
M: circle perimeter radius>> 2 * pi * ;
TUPLE: quad < shape width height ;
M: quad area [ width>> ] [ height>> ] bi * ;
TUPLE: rectangle < quad ;
M: rectangle perimeter [ width>> 2 * ] [ height>> 2 * ] bi + ;
: hypot ( a b -- c ) [ sq ] bi@ + sqrt ;
TUPLE: parallelogram < quad skew ;
M: parallelogram perimeter
[ width>> 2 * ] [ [ height>> ] [ skew>> ] bi hypot 2 * ] bi + ;