Objective-C Issues

class-Nil

People ( From: lines )
 Kresten Krab Thorup 
Subjects ( 1 mails )
 Introducing class Nil
Document
Date: Mon, 1 Mar 1993 14:00:34 +0100
From: Kresten Krab Thorup 
To: gnu-objc@gnu.ai.mit.edu
Subject: Introducing class Nil
Cc: krab@iesd.auc.dk

Hi again

I have been considering the possibility to introduce class Nil as a
full featured class, just as any other class.  Since the special nil
object (currently defined as "(id)0") actually has some object-like
behavior, it would be nice to encapsulate it in a real class.

Right now I can think of two actions that is expected from the nil
object:  Ignoring messages send to it, and being able to be stored on
persistent storage.  People on the list could possibly come up with
more `behavior' bound to the nil object.

I think of class Nil, as a special class, which has exactly one
instance, the `nilObject'.  For the matter of ignoring messages send
to it, this could be done by overwriting `doesNotRecognize:' to simply
not print any warning.  The messenger should redirect all messages
send to a null pointer to this nilObject.  Like this:

  IMP objc_mesgSend(id receiver, SEL operation) 
  {
    if(receiver==0)
      receiver = nilObject;
    return perform_lookup(receiver->class, operation);
  }

The messenger will have to handle a null pointer especially anyway, so
this will not cost anything.

Another benefit from having a such `nilObject' is that the programmer
could perhaps optionally set a flag indicating weither
`doesNotRecognize:' should actually print a warning message when
invoked.  This would be nice to have when locating bugs.

For the matter of storing instances, this will come immediately as a
result of changing the messenger like above -- we will simply define
storeOn: etc methods directly in class Nil.  

I think `nil' would still have to be defined as `(id)0', since a lot
of things depend on this.  The only place to take special care about
the nil class would be in the messenger as far as I can se.

Other methods which could possibly defined in class nil is `isNil'
like Smalltalk does.

I have included a proposed interface for class Nil below.

Thanks,

Kresten

------------------------------------------------------------

extern id nilObject;
extern Class_t nilClass;

@interface Nil:Object
{
  BOOL ignoreNilMessages;       /* global flag */
}

+ new;                          /* allways return `nilObject' */

+ initialize;                   /* allocate `nilObject' using 
                                   class_createInstance()     */

- storeOn: aStream;             /* print a nil object */

+ catchMessages;                /* set flag indicating if
+ ignoreMessages;                  doesNotRecognize: should warn */

- doesNotRecognize:(SEL)aSel;   /* ignore or warn as prescribed
                                   by the global flag */

- ( BOOL ) isNil;		/* always answers YES */

@end

@interface Object (isNil)
- ( BOOL ) isNil;		/* always answers NO */
@end

------------------------------------------------------------

Statistics
 filename:           class-Nil
 number of mails:    1
 number of writers:  1
 line count:         89
 word count:         425
 character count:    2950

created by Helge Hess ( helge@mdlink.de )
MDlink online service center ( www.mdlink.de )