(*oops.ex*) (* A simple example of oops*) use "oops-sig"; use "oops-struct"; open oops; (**************************************************************************) val point_2D = defflavor (0,0); val point_2D = defmethod "inc x" point_2D (fn a => let val (x:int,y:int) = a in (x+1,y) end); val point_2D = defmethod "inc y" point_2D (fn a => let val (x:int,y:int) = a in (x,y+1) end); val point_2D = defmethod "zero" point_2D (fn a => (0,0)); val p2 = make_instance point_2D; describe p2; (**************************************************************************) val point_3D = defflavor (0,0,0); val point_3D = defmethod "inc x" point_3D (fn a => let val (x:int,y:int,z:int) = a in (x+1,y,z) end); val point_3D = defmethod "inc y" point_3D (fn a => let val (x:int,y:int,z:int) = a in (x,y+1,z) end); val point_3D = defmethod "inc z" point_3D (fn a => let val (x:int,y:int,z:int) = a in (x,y,z+1) end); val point_3D = defmethod "zero" point_3D (fn a => (0,0,0)); val p3 = make_instance point_3D; describe p3; (**************************************************************************) val var = defflavor (~999,[~999],[~999]); val var = defmethod "reset" var (fn a => let val (_,_,o_d) = a in (~999,o_d,o_d) end); val var = defmethod "instantiate" var (fn a => let val (_,d,o_d) = a in (hd d,tl d,o_d) end); val con = defflavor(make_instance var, (fn a => let val (x:int,y:int) = a in x=y end), make_instance var,true); val con = defmethod "check" con (fn a => let val (v1,r,v2,_) = a val (val1,_,_) = inst_vars v1 val (val2,_,_) = inst_vars v2 in (v1,r,v2,r(val1,val2)) end); val v1 = make_instance var and v2 = make_instance var and c = make_instance con; setf v1 (~999,[1,2,3],[1,2,3]); setf v2 (~999,[2,3,4],[2,3,4]); setf c (v1,(fn a => let val (x:int,y:int) = a in x>y end),v2,true); send "instantiate" v1; send "instantiate" v2; send "check" c;