[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. Building Classes

A class in EIEIO has a similar structure to that found in other languages. A new class is created with defclass

Function: defclass class-name superclass-list slot-list options-or-doc

This function is specified by CLOS, and EIEIO conforms in structure.

Creates a new class called class-name. The created variable's documentation string is set to a modified version of the doc string found in options-or-doc. Each time a slot is defined the variables documentation string is updated to include the methods documentation as well.

The parent class for class-name is superclass-list which must be a list. Each element of this list must be a class. These classes form the parents of the class being created. Every slot in parent is replicated in the new class. If two parents share the same slot name, the parent which appears in the list first sets the attributes for that slot. If a slot in the new class' slot list matches a parent, then the new specifications for the child class override that of the parent.

slot-list is a list of lists. Each sublist defines an attribute. These lists are of the form (name :tag1 value1 :tag2 value2 :tagn valuen). Some valid CLOS tags are:

The argument used during initialization. See section 5. Making New Objects. A good symbol to use for initarg is one that starts with a colon :.
A lisp expression used to generate the default value for this slot. If :initform is left out, that slot defaults to being unbound. The value passed to initform is automatically quoted. Thus,
:initform (1 2 3)
appears as the specified list in the default object. A function like this:
:initform +
is quoted in as a symbol.

Lastly, using the function lambda-default instead of lambda will let you specify a lambda expression to use as the value, without evaluation.

An unquoted type specifier used to validate data set into this slot. @xref{(cl)Type Predicates}. Here are some examples:
A symbol.
A number type
An object of your class type.
(or null symbol)
A symbol, or nil.
A function symbol, or a lambda-default expression.
Either :class or :instance (defaults to :instance) used to specify how data is stored. Slots stored per instance have unique values for each object. Slots stored per class have shared values for each object. If one object changes a :class allocated slot, then all objects for that class gain the new value.
Documentation detailing the use of this slot. This documentation is exposed when the user describes a class, and during customization of an object.

Some tags whose behaviors do not yet match CLOS are:

Name of a generic function which can be used to fetch the value of this slot. You can call this function later on your object and retrieve the value of the slot.
Name of a generic function which will write this slot.
Name of a generic function which will read this slot.

Some tags which are unique to EIEIO are:

A custom :type specifier used when editing an object of this type. See documentation for defcustom for details. This specifier is equivalent to the :type field of a defcustom call.
When customizing an object, the value of :label will be used instead of the slot name. This enables better descriptions of the data than would usually be afforded.
Similar to defcustom's :group command, this organizes different slots in an object into groups. When customizing an object, only the slots belonging to a specific group need be worked with, simplifying the size of the display.
A CLOS unsupported specifier which indicates that only methods of this class may access this slot.

When using a slot referencing function, if the value behind slot is private or protected, then the current scope of operation must be within a method of the calling object.

Valid values are:

Anyone may access this slot from any scope.
Only methods of the same class, or of a child class may access this slot.
Only methods of the same class as this slot's definition may access this slot.

Additionally, CLOS style class options are available. These are various options attached to a class. These options can occur in place or in addition to a documentation string. If both occur, then the options appear before the documentation string. In CLOS, documentation is one of the options available to a class, so the ability to have a standalone documentation string is specific to Emacs.

Possible class options are:

Doc string to use for this class. If an Emacs style documentation string is also provided, then this option is ignored.
This is not a CLOS option.

If this option is non-nil, and the :initform is nil, but the :type is specifies something such as string then allow this to pass. The default is to have this option be off. This is implemented as an alternative to unbound slots.

This is not a CLOS option.

Tags a class as being abstract, or uninstantiable.

This is a list of groups that can be customized within this class. This slot is auto-generated when a class is created and need not be specified. It can be retrieved with the class-option command, however, to see what groups are available.
Unsupported CLOS option. Enables the use of a different base class other than standard-class.
Unsupported CLOS option. Specifies a list of initargs to be used when creating new objects. As far as I can tell, this duplicates the function of :initform.

See section 2. CLOS compatibility, for more details on CLOS tags versus EIEIO specific tags.

The whole definition may look like this:

(defclass data-object ()
  ((value :initarg :value
	  :initform nil
	  :accessor get-value
          "Lisp object which represents the data this object maintains."
	  :protection :protected)
   (reference :initarg :reference
	      :initform nil
              :type list
              :custom (repeat object)
              "List of objects looking at this object.
The method `update-symbol' is called for each member of `reference' whenever 
`value' is modified."
	      :protection :protected)
  "Data object which tracks referencers.")

Variable: eieio-error-unsupported-class-tags
If Non-nil, then defclass will throw an error if a tag in a slot specifier is unsupported.

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by XEmacs Webmaster on October, 2 2007 using texi2html