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 #6 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
class Integer
   feat X
   meth init(Xi) self.X = Xi end
   meth value(?$) self.X end
   meth getClass(?$) Integer end
   meth instanceOf(F ?$) F == Integer end
   meth equals(F ?$) {F instanceOf(Integer $)} andthen {F value($)} == self.X end
end
class NumD
   meth getClass(?$) NumD end
   meth instanceOf(F ?$) F == NumD end
   meth equals(F ?$) {F instanceOf(NumD $)} end
end
class Zero from NumD
   meth init skip end
   meth getClass(?$) Zero end
   meth instanceOf(N ?$) N == Zero orelse NumD,instanceOf(N $) end
   meth equals(N ?$) {N instanceOf(Zero $)} end
end

%%%%%%%%%%%%%%%%%%% Chapter - 6 %%%%%%%%%%%%%%%%%%%%%%

% 6.9
class PieD
   meth remove(RemFn O ?$) raise abstract() end end
   meth substitute(SubFn N O ?$) raise abstract() end end
end
class Bottom from PieD
   meth init skip end
   meth remove(RemFn O ?$) {RemFn forBottom(O $)} end
   meth substitute(SubFn N O ?$) {SubFn forBottom(N O $)} end
end
class Topping from PieD
   feat T R
   meth init(Ti Ri)
      self.T = Ti
      self.R = Ri
   end
   meth remove(RemFn O ?$) {RemFn forTopping(self.T self.R O $)} end
   meth substitute(SubFn N O ?$) {SubFn forTopping(self.T self.R N O $)} end
end

% 6.13
class RemoveV
   meth init skip end
   meth forBottom(O ?$) {New Bottom init} end
   meth forTopping(T R O ?$)
      if {O equals(T $)}
         then {R remove(self O $)}
         else {New Topping init(T {R remove(self O $)})}
      end
   end
end
class SubstituteV
   meth init skip end
   meth forBottom(N O ?$) {New Bottom init} end
   meth forTopping(T R N O ?$)
      if {O equals(T $)}
         then {New Topping init(N {R substitute(self N O $)})}
         else {New Topping init(T {R substitute(self N O $)})}
      end
   end
end

% 6.21
{Browse 21#{{New Topping init({New Anchovy init}
               {New Topping init({New Integer init(3)}
                  {New Topping init({New Zero init}
                     {New Bottom init})})})}
                        remove({New RemoveV init} {New Zero init} $)}}

% 6.23
{Browse 23#{{New Topping init({New Integer init(3)}
               {New Topping init({New Integer init(2)}
                  {New Topping init({New Integer init(3)}
                     {New Bottom init})})})}
                        substitute({New SubstituteV init} {New Integer init(5)} {New Integer init(3)} $)}}

% 6.30
class Substitute2V
   feat N O
   meth init(Ni Oi)
      self.N = Ni
      self.O = Oi
   end
   meth forBottom(?$) {New Bottom2 init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {New Topping2 init(self.N {R substitute(self $)})}
         else {New Topping2 init(T {R substitute(self $)})}
      end
   end
end
class Remove2V
   feat O
   meth init(Oi) self.O = Oi end
   meth forBottom(?$) {New Bottom2 init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {R remove(self $)}
         else {New Topping2 init(T {R remove(self $)})}
      end
   end
end

% 6.37
class Pie2D
   meth remove(RemFn ?$) raise abstract() end end
   meth substitute(SubFn ?$) raise abstract() end end
end
class Bottom2 from Pie2D
   meth init skip end
   meth remove(RemFn ?$) {RemFn forBottom($)} end
   meth substitute(SubFn ?$) {SubFn forBottom($)} end
end
class Topping2 from Pie2D
   feat T R
   meth init(Ti Ri)
      self.T = Ti
      self.R = Ri
   end
   meth remove(RemFn ?$) {RemFn forTopping(self.T self.R $)} end
   meth substitute(SubFn ?$) {SubFn forTopping(self.T self.R $)} end
end

% 6.34
{Browse 34#{{New Topping2 init({New Integer init(3)}
               {New Topping2 init({New Integer init(2)}
                  {New Topping2 init({New Integer init(3)}
                     {New Bottom2 init})})})}
                        substitute(
                           {New Substitute2V init(
                              {New Integer init(5)}
                              {New Integer init(3)})}
                           $)}}

% 6.35
{Browse 35#{{New Topping2 init({New Integer init(3)}
               {New Topping2 init({New Integer init(2)}
                  {New Topping2 init({New Integer init(3)}
                     {New Bottom2 init})})})}
                        substitute(
                           {New Substitute2V init(
                              {New Integer init(7)}
                              {New Integer init(2)})}
                           $)}}

% 6.44
class PieVisitorI
   meth forBottom(?$) raise abstract() end end
   meth forTopping(T R ?$) raise abstract() end end
end

% 6.50
class Remove3V from PieVisitorI
   feat O
   meth init(Oi) self.O = Oi end
   meth forBottom(?$) {New Bottom3 init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {R accept(self $)}
         else {New Topping3 init(T {R accept(self $)})}
      end
   end
end

class Pie3D
   meth accept(Ask ?$) raise abstract() end end
end
class Bottom3 from Pie3D
   meth init skip end
   meth accept(Ask ?$) {Ask forBottom($)} end
end
class Topping3 from Pie3D
   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

{Browse 50#{{New Topping3 init({New Integer init(3)}
               {New Topping3 init({New Integer init(2)}
                  {New Topping3 init({New Integer init(3)}
                     {New Bottom3 init})})})}
                        accept(
                           {New Remove3V init({New Integer init(2)})}
                        $)}}

% 6.55
class Substitute3V from PieVisitorI
   feat N O
   meth init(Ni Oi)
      self.N = Ni
      self.O = Oi
   end
   meth forBottom(?$) {New Bottom3 init} end
   meth forTopping(T R ?$)
      if {self.O equals(T $)}
         then {New Topping3 init(self.N {R accept(self $)})}
         else {New Topping3 init(T {R accept(self $)})}
      end
   end
end

{Browse 55#{{New Topping3 init({New Integer init(3)}
               {New Topping3 init({New Integer init(2)}
                  {New Topping3 init({New Integer init(3)}
                     {New Bottom3 init})})})}
                        accept(
                           {New Substitute3V init(
                              {New Integer init(5)}
                              {New Integer init(3)})}
                           $)}}

% 6.67
class LimitedSubstituteV from PieVisitorI
   feat C N O
   meth init(Ci Ni Oi)
      self.C = Ci
      self.N = Ni
      self.O = Oi
   end
   meth forBottom(?$) {New Bottom3 init} end
   meth forTopping(T R ?$)
      if self.C == 0
         then {New Topping3 init(T R)}
         else
            if {self.O equals(T $)}
               then {New Topping3 init(self.N {R accept({New LimitedSubstituteV init(self.C-1 self.N self.O)} $)})}
               else {New Topping3 init(T {R accept(self $)})}
            end
      end
   end
end

% 6.59
{Browse 59#{{New Topping3 init({New Anchovy init}
               {New Topping3 init({New Tuna init}
                  {New Topping3 init({New Anchovy init}
                     {New Topping3 init({New Tuna init}
                        {New Topping3 init({New Anchovy init}
                           {New Bottom3 init})})})})})}
                              accept(
                                 {New LimitedSubstituteV init(
                                    2
                                    {New Salmon init}
                                    {New Anchovy init})}
                                 $)}}

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