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 #10 Examples in Oz
% Defined in previous chapters
class FishD
   meth getClass(?$) FishD end
   meth instanceOf(F ?$) F == FishD end
   meth equals(F ?$) {F instanceOf(FishD $)} end
end
class Anchovy from FishD
   meth init skip end
   meth getClass(?$) Anchovy end
   meth instanceOf(F ?$) F == Anchovy orelse FishD,instanceOf(F $) end
   meth equals(F ?$) {F instanceOf(Anchovy $)} end
end
class Salmon from FishD
   meth init skip end
   meth getClass(?$) Salmon end
   meth instanceOf(F ?$) F == Salmon orelse FishD,instanceOf(F $) end
   meth equals(F ?$) {F instanceOf(Salmon $)} end
end
class Tuna from FishD
   meth init skip end
   meth getClass(?$) Tuna end
   meth instanceOf(F ?$) F == Tuna orelse FishD,instanceOf(F $) end
   meth equals(F ?$) {F instanceOf(Tuna $)} end
end

%%%%%%%%%%%%%%%%%%% Chapter - 10 %%%%%%%%%%%%%%%%%%%%%%

% 10.6
class PiemanI
   meth addTopping(T $) raise abstract() end end
   meth removeTopping(T $) raise abstract() end end
   meth substituteTopping(N O $) raise abstract() end end
   meth occursTopping(O $) raise abstract() end end
end

% 10.2
class PiemanM from PiemanI
   attr P
   meth init P := {New Bottom init} end
   meth addTopping(T ?$)
      P := {New Topping init(T @P)}
      {self occursTopping(T $)}
   end
   meth removeTopping(T ?$)
      P := {@P accept({New RemoveV init(T)} $)}
      {self occursTopping(T $)}
   end
   meth substituteTopping(N O ?$)
      P := {@P accept({New SubstituteV init(N O)} $)}
      {self occursTopping(N $)}
   end
   meth occursTopping(O ?$)
      {@P accept({New OccursV init(O)} $)}
   end
end

% 10.8
class PieVisitorI
   meth forBottom($) raise abstract() end end
   meth forTopping(T R $) raise abstract() end end
end
class PieD
   meth accept(Ask ?$) raise abstract() end end
end
class Bottom from PieD
   meth init skip end
   meth accept(Ask ?$) {Ask forBottom($)} end
end
class Topping from PieD
   feat T R
   meth init(Ti Ri)
      self.T = Ti
      self.R = Ri
   end
   meth accept(Ask ?$) {Ask forTopping(self.T self.R $)} end
end

% 10.9
class OccursV from PieVisitorI
   feat A
   meth init(Ai) self.A = Ai end
   meth forBottom(?$) 0 end
   meth forTopping(T R ?$)
      if {T equals(self.A $)}
         then {R accept(self $)} + 1
         else {R accept(self $)}
      end
   end
end
class SubstituteV from PieVisitorI
   feat N O
   meth init(Ni Oi)
      self.N = Ni
      self.O = Oi
   end
   meth forBottom(?$) {New Bottom init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {New Topping init(self.N {R accept(self $)})}
         else {New Topping init(T {R accept(self $)})}
      end
   end
end

% 10.10
class RemoveV from PieVisitorI
   feat O
   meth init(Oi) self.O = Oi end
   meth forBottom(?$) {New Bottom init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {R accept(self $)}
         else {New Topping init(T {R accept(self $)})}
      end
   end
end

% 10.11
{Browse 11#{{New PiemanM init} occursTopping({New Anchovy init} $)}}

% 10.14
{Browse 14#{{New PiemanM init} addTopping({New Anchovy init} $)}}

% 10.21
{Browse 21#{{New PiemanM init} addTopping({New Anchovy init} $)}}

% 10.23
Y = {New PiemanM init}

% 10.24
{Browse 24#{Y addTopping({New Anchovy init} $)}}

% 10.25
{Browse 25#{Y substituteTopping({New Tuna init} {New Anchovy init} $)}}

% 10.26
{Browse 26#{Y occursTopping({New Anchovy init} $)}}

% 10.27
YY = {New PiemanM init}
_ = {YY addTopping({New Anchovy init} $)}
_ = {YY addTopping({New Anchovy init} $)}
_ = {YY addTopping({New Salmon init} $)}

% 10.28
_ = {YY addTopping({New Tuna init} $)}
_ = {YY addTopping({New Tuna init} $)}
_ = {YY substituteTopping({New Tuna init} {New Anchovy init} $)}
{Browse 28#{YY occursTopping({New Tuna init} $)}}

% 10.29
{Browse 26#{YY removeTopping({New Tuna init} $)}}

% 10.31
{Browse 31#{YY occursTopping({New Salmon init} $)}}

% 10.32
{Browse 32#{Y occursTopping({New Salmon init} $)}}

% 10.41
class PieVisitor2I
   meth forBottom(That $) raise abstract() end end
   meth forTopping(That $) raise abstract() end end
end

% 10.42
class Pie2D
   meth accept(Ask ?$) raise abstract() end end
end
class Bottom2 from Pie2D
   meth init skip end
   meth accept(Ask ?$) {Ask forBottom(self $)} end
end

% 10.44
class Topping2 from Pie2D
   feat t r
   meth init(T R)
      self.t = {NewCell T}
      self.r = {NewCell R}
   end
   meth accept(Ask ?$) {Ask forTopping(self $)} end
end

% 10.45
class Occurs2V from PieVisitor2I
   feat A
   meth init(Ai) self.A = Ai end
   meth forBottom(That ?$) 0 end
   meth forTopping(That ?$)
      if {@(That.t) equals(self.A $)}
         then {@(That.r) accept(self $)} + 1
         else {@(That.r) accept(self $)}
      end
   end
end

% 10.50
class Remove2V from PieVisitor2I
   feat O
   meth init(Oi) self.O = Oi end
   meth forBottom(That ?$) {New Bottom2 init} end
   meth forTopping(That ?$)
      if {self.O equals(@(That.t) $)}
         then {@(That.r) accept(self $)}
         else {New Topping2 init(@(That.t) {@(That.r) accept(self $)})}
      end
   end
end

% 10.54
class Substitute2V from PieVisitor2I
   feat N O
   meth init(Ni Oi)
      self.N = Ni
      self.O = Oi
   end
   meth forBottom(That ?$) That end
   meth forTopping(That ?$)
      if {self.O equals(@(That.t) $)}
         then
            That.r := self.N
            _ = {@(That.r) accept(self $)}
            That
         else
            _ = {@(That.r) accept(self $)}
            That
      end
   end
end

% 10.65
class PointD
   feat x y
   meth init(X Y)
      self.x = {NewCell X}
      self.y = {NewCell 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 moveBy(Dx Dy ?$)
      (self.x) := @(self.x) + Dx
      (self.y) := @(self.y) + Dy
      {self distanceTo0($)}
   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
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

% 10.67
{Browse 67#{New ManhattanPt init(1 4)}}

% 10.70
PtChild = {New ManhattanPt init(1 4)}
{Browse 70#{PtChild distanceTo0($)}}

% 10.71
{Browse 71#{PtChild moveBy(2 8 $)}}

% 10.72
PtChildBalloon = {New ShadowedManhattanPt init(1 4 1 1)}
{Browse 72#{PtChildBalloon distanceTo0($)}}

% 10.73
{Browse 73#{PtChildBalloon moveBy(2 8 $)}}

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