[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Accessor names for flavor instance variables



   Date: Fri, 2 Jun 89 11:24 EDT
   From: barmar@Think.COM (Barry Margolin)

       Date: Fri, 2 Jun 89 07:24:09 mdt
       From: intvax!drstrip@unmvax.cs.unm.edu

       Consider the following two (trivial) flavors:

       (defflavor f 
	  (a b c)
	  ()
	  :readable-instance-variables)

       (defflavor g
	  (d)
	  (f))

       I would like the accessor functions for the instance
       variables of g to be g-a, g-b, ... Unfortunately, it seems
       that the accessor function name is based on the accessor
       name of the mixin.

   There doesn't seem to be a way to get what you want automatically.  The
   assumption in this design is that anyone trying to access the slots A,
   B, or C is thinking of the object as an F, not as a G.  This is part of
   the modularity of Flavors; G-specific interfaces should be independent
   of the internal structure of its components.  Suppose you were to
   redesign F, and get rid of its instance variable C.  You would then look
   for all the callers of F-C and fix them, or you would define a method
   F-C that computes the value.  But if you got methods defined in the
   dependent flavors, too, then you'd have to fix all the callers of those,
   too.

   If you really want G-A, G-B, etc., for the sake of modularity, I
   suggest you do:

   (defmethod (g-a g) ()
     (f-a self))
   ...

   You can also define them as:

   (defmethod (g-a g) ()
     a)

   although in this case you should put a :REQUIRED-INSTANCE-VARIABLES
   clause in G's defflavor.

						   barmar

Another thing that frustrates me about this is that if you use the old
style invocation; :settable, :gettable :initable,  then you could do a
(send <instance of g> :a).  The new invocation requires you to keep track
of the flavor an instance variable is defined for.