About AFP The following Oz code is derived from the examples provided in the book:
      "A Little Java, A Few Patterns" by Matthias Felleisen and Daniel P. Friedman.
      http://www.ccs.neu.edu/home/matthias/BALJ/

Chapter #9 Examples in Oz
%%%%%%%%%%%%%%%%%%% Chapter - 9 %%%%%%%%%%%%%%%%%%%%%%

% 9.1
class PointD
   feat x y
   meth init(X Y)
      self.x = X
      self.y = Y
   end
   meth closerTo0(P ?$)
      {self distanceTo0($)} =< {P distanceTo0($)}
   end
   meth minus(P ?$)
      {New CartesianPt init(self.x-P.x self.y-P.y)}
   end
   meth distanceTo0(?$) raise abstract() end end
end
class CartesianPt from PointD
   meth init(X Y)
      PointD,init(X Y)
   end
   meth distanceTo0(?$)
      {FloatToInt {Sqrt {IntToFloat self.x*self.x + self.y*self.y}}}
   end
end
class ManhattanPt from PointD
   meth init(X Y)
      PointD,init(X Y)
   end
   meth distanceTo0(?$)
      self.x + self.y
   end
end

% 9.2
class ShadowedManhattanPt from ManhattanPt
   feat Dx Dy
   meth init(X Y DX DY)
      PointD,init(X Y)
      self.Dx = DX
      self.Dy = DY
   end
   meth distanceTo0(?$)
      ManhattanPt,distanceTo0($) + self.Dx + self.Dy
   end
end

% 9.5
{Browse 5#{New ShadowedManhattanPt init(2 3 1 0)}}

% 9.9
{Browse 9#{{New ShadowedManhattanPt init(2 3 1 0)} distanceTo0($)}}

% 9.17
class ShadowedCartesianPt from CartesianPt
   feat Dx Dy
   meth init(X Y DX DY)
      PointD,init(X Y)
      self.Dx = DX
      self.Dy = DY
   end
   meth distanceTo0(?$)
      % CartesianPt,distanceTo0($) + {FloatToInt {Sqrt {IntToFloat self.Dx*self.Dx + self.Dy*self.Dy}}}
      {{New CartesianPt init(self.x+self.Dx self.y+self.Dy)} distanceTo0($)}
   end
end

% 9.11
{Browse 11#{New ShadowedCartesianPt init(12 5 3 4)}}

% 9.12
{Browse 12#{{New ShadowedCartesianPt init(12 5 3 4)} distanceTo0($)}}

% 9.19
local P1 P2 in
   P1 = {New CartesianPt init(3 4)}
   P2 = {New ShadowedCartesianPt init(1 5 1 2)}
   {Browse 19#{P1 closerTo0(P2 $)}}
end

% 9.25
class ShapeD
   meth accept(Ask $) raise abstract() end end
end
class Circle from ShapeD
   feat R
   meth init(Ri) self.R = Ri end
   meth accept(Ask $) {Ask forCircle(self.R $)} end
end
class Square from ShapeD
   feat S
   meth init(Si) self.S = Si end
   meth accept(Ask $) {Ask forSquare(self.S $)} end
end

% 9.26
class ShapeVisitorI
   meth forCircle(R $) raise abstract() end end
   meth forSquare(S $) raise abstract() end end
   meth forTranslation(Q S $) raise abstract() end end
end

% 9.27
class Translation from ShapeD
   feat Q S
   meth init(Qi Si)
      self.Q = Qi
      self.S = Si
   end
   meth accept(Ask $) {Ask forTranslation(self.Q self.S $)} end
end

% 9.28
{Browse 28#{New Circle init(10)}}

% 9.30
{Browse 30#{New Square init(10)}}

% 9.39
{Browse 38#{New Translation init(
               {New CartesianPt init(5 6)}
               {New Circle init(10)})}}

% 9.49
class HasPtV from ShapeVisitorI
   feat P
   meth init(Pi) self.P = Pi end
   meth newHasPt(P ?$) {New HasPtV init(P)} end
   meth forCircle(R ?$)
      {self.P distanceTo0($)} =< R
   end
   meth forSquare(S ?$)
      if self.P.x =< S
         then self.P.y =< S
         else false
      end
   end
   meth forTranslation(Q S ?$)
      {S accept({self newHasPt({self.P minus(Q $)} $)} $)}
   end
   meth forUnion(A B $) raise test end end
end

% 9.50
{Browse 50#{{New Circle init(10)} accept({New HasPtV init({New CartesianPt init(10 10)})} $)}}

% 9.51
{Browse 51#{{New Square init(10)} accept({New HasPtV init({New CartesianPt init(10 10)})} $)}}

% 9.52
{Browse 52#{{New Translation init(
               {New CartesianPt init(5 6)}
               {New Circle init(10)})}
                  accept({New HasPtV init({New CartesianPt init(10 10)})} $)}}

% 9.53
{Browse 53#{{New Translation init(
               {New CartesianPt init(5 4)}
               {New Translation init(
                  {New CartesianPt init(5 6)}
                  {New Circle init(10)})})}
                     accept({New HasPtV init({New CartesianPt init(10 10)})} $)}}

% 9.67
class UnionVisitorI from ShapeVisitorI
   meth forUnion(S T $) raise abstract() end end
end

% 9.62
class Union from ShapeD
   feat S T
   meth init(Si Ti)
      self.S = Si
      self.T = Ti
   end
   meth accept(Ask $) {Ask forUnion(self.S self.T $)} end
end

% 9.71
{Browse 71#{New Translation init(
               {New CartesianPt init(12 2)}
               {New Union init(
                  {New Square init(10)}
                  {New Translation init(
                     {New CartesianPt init(4 4)}
                     {New Circle init(5)})})})}}

% 9.74
class UnionHasPtV from HasPtV UnionVisitorI
   meth init(P) HasPtV,init(P) end
   meth newHasPt(P ?$) {New UnionHasPtV init(P)} end
   meth forUnion(S T ?$)
      if {S accept(self $)}
         then true
         else {T accept(self $)}
      end
   end
   meth forCircle(R $) HasPtV,forCircle(R $) end
   meth forSquare(S $) HasPtV,forSquare(S $) end
   meth forTranslation(Q S $) HasPtV,forTranslation(Q S $)  end
end

% 9.78 | 9.112
{Browse 78#{{New Translation init(
               {New CartesianPt init(3 7)}
               {New Union init(
                  {New Square init(10)}
                  {New Circle init(5)})})}
                     accept({New UnionHasPtV init({New CartesianPt init(13 17)})} $)}}

% 9.119
{Browse 119#{{New Union init(
                  {New Square init(10)}
                  {New Circle init(10)})}
                     accept({New UnionHasPtV init({New CartesianPt init(10 10)})} $)}}

Chris Rathman / Chris.Rathman@tx.rr.com