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

Re: Constructors



     Date: 21 Oct 87 16:39 PDT
     From: Danny Bobrow <Bobrow.pa@xerox.com>
     Subject: Re: Constructors 
     
      jak:      I don't think the difference between;
              	(make-foo :name 'bar :number-of-widgits 50)
              and:
              	(make-instance 'foo :name 'bar :number-of-widgits 50)
              is sufficiently large to constitute a useful addition in
             abstraction.
     
     pd  The difference is the same as between
         (send object :do-this ) and (do-this object).
     
     I don't understand the analogy at all.

If the interface to my program is a bunch of SEND messages, I expose (to
my user)the fact that I am using object programming.  Sometimes this is
fine, sometimes I want to be more abstract.  Generic functions give me
this abstraction.  If the consing interface of my program is a bunch of
MAKE-INSTANCE, I expose the fact that I am using object programming.  In
this sense, a constructor function gives me an abstraction for consing,
like generic functions give me the abstraction for programming.
      
     pd   You do that by adding the following option in the defclass:
          (:CONSTRUCTOR make-bar-foo (number-of-widgits &aux (name 'bar)))
         This option is textually close to the initargs declaration,
         which is another advantage over a separate constructor function.
     
     1) How does the &aux get added to the argument list of a constructor?
     How does this do what jak asked for?

I am including the relevant part from Moon's proposal:
Each parameter supplies the value of
one initarg, determined by the following rules:
 - If a parameter variable name is EQ to an initarg name, the parameter 
   supplies the value of that initarg.
 - If a parameter variable name is not EQ to any initarg name, but the symbol
   in the keyword package with the same name as the parameter variable
   name is EQ to an initarg name, the parameter supplies the value of that
   initarg.
 - If neither rule succeeds, signal an error.
The second rule exists because initarg names are often keyword symbols, which
are not valid as variable names.
-constructor-lambda-list- allows all of the standard lambda-list features that
DEFUN allows. 

     2) This option is not textually close to any inherited initarg
     declarations.  The fact that it is close to some and not all has large
     confusion potential.

It is not more confusing that the :DEFAULT-INITARGS option, and
certainly less than a separate constructor definition.
       
         On any architecture, if you implement MAKE-INSTANCE by
         interpreting the various data structures (initargs list, default
         initargs), it is going to be costly.  You will need a mechanism to
         generate some specialized code reflecting the interpretation for a
         particular class.  
     
     This is clearly a good thing.
     The question it is better to focus it on calls to make-instance, or is
     it better  to combine this optimization with an automatic function
     generation facility, with other features?  The former seems like the
     "general mechanism" to me (pd says "I think it is better to
     agree one a general mechanism.")

I see moon's proposal being a good combination of desirables features.

Patrick.