Contributed by Chris Rathman
ORIGIN '~beta/basiclib/v1.6/betaenv';
--- lib: Attributes ---
Shape: (#
x: @Integer;
y: @Integer;
(* accessors for x & y coordinates *)
getX: (# exit x #);
getY: (# exit y #);
setX: (#
newx: @Integer;
enter newx
do newx -> x;
#);
setY: (#
newy: @Integer;
enter newy
do newy -> y;
#);
(* move the x & y coordinates *)
moveTo: (#
newx: @Integer;
newy: @Integer;
enter (newx, newy)
do
newx -> setX;
newy -> setY;
#);
rMoveTo: (#
deltax: @Integer;
deltay: @Integer;
enter (deltax, deltay)
do ((getX + deltax), (getY + deltay)) -> moveTo;
#);
(* virtual routine - draw the shape *)
draw:< (#
do
'Drawing a ' -> putText;
inner;
newline;
#)
#);
|
ORIGIN '~beta/basiclib/v1.6/betaenv';
--- INCLUDE './shape'
--- lib: Attributes ---
(* function to create rectangle instance *)
NewRectangle: (#
x: @Integer;
y: @Integer;
width: @Integer;
height: @Integer;
newInstance: @Rectangle;
enter (x, y, width, height)
do
(x, y) -> newInstance.moveTo;
width -> newInstance.setWidth;
height -> newInstance.setHeight;
exit newInstance[]
#);
Rectangle: Shape (#
width: @Integer;
height: @Integer;
(* accessors for width & height *)
getWidth: (# exit width #);
getHeight: (# exit height #);
setWidth: (#
newwidth: @Integer;
enter newwidth
do newwidth -> width;
#);
setHeight: (#
newheight: @Integer;
enter newheight
do newheight -> height;
#);
(* draw the rectangle *)
draw::< (#
do
'Rectangle at:(' -> putText;
getX -> putInt;
',' -> putText;
getY -> putInt;
'), width ' -> putText;
getWidth -> putInt;
', height ' -> putText;
getHeight -> putInt;
#);
#);
|
ORIGIN '~beta/basiclib/v1.6/betaenv';
--- INCLUDE './shape'
--- lib: Attributes ---
(* function to create circle instance *)
NewCircle: (#
x: @Integer;
y: @Integer;
radius: @Integer;
newInstance: @Circle;
enter (x, y, radius)
do
(x, y) -> newInstance.moveTo;
radius -> newInstance.setRadius;
exit newInstance[]
#);
Circle: Shape (#
radius: @Integer;
(* accessors for the radius *)
getRadius: (# exit radius #);
setRadius: (#
newradius: @Integer
enter newradius
do newradius -> radius;
#);
(* draw the circle *)
draw::< (#
do
'Circle at:(' -> putText;
getX -> putInt;
',' -> putText;
getY -> putInt;
'), radius ' -> putText;
getRadius -> putInt;
#);
#);
|
ORIGIN '~beta/basiclib/v1.6/betaenv';
--- INCLUDE './rectangle'
--- INCLUDE './circle'
--- PROGRAM: descriptor ---
(#
i: @Integer;
scribble: [2] ^Shape;
rect: ^Rectangle;
do
(* create some shape instances *)
(10, 20, 5, 6) -> NewRectangle -> scribble[1][];
(15, 25, 8) -> NewCircle -> scribble[2][];
(* iterate through the list and handle shapes polymorphically *)
(for i:scribble.range repeat
scribble[i].draw;
(100, 100) -> scribble[i].rMoveTo;
scribble[i].draw;
for);
(* call a rectangle specific function *)
(0, 0, 15, 15) -> NewRectangle -> rect[];
30 -> rect.setWidth;
rect.draw;
#)
|
Drawing a Rectangle at:(10,20), width 5, height 6 Drawing a Rectangle at:(110,120), width 5, height 6 Drawing a Circle at:(15,25), radius 8 Drawing a Circle at:(115,125), radius 8 Drawing a Rectangle at:(0,0), width 30, height 15 |