Common Lisp the Language, 2nd Edition
Next: Other Aspects of
Up: Structures of Explicitly
Previous: Unnamed
Structures
A ``named’’ structure has the property that, given an instance of the
structure, the structure name (that names the type) can be reliably
recovered. For structures defined with no :type
option, the
structure name actually becomes part of the Common Lisp data-type
system. The function type-of
, when applied to such a
structure, will return the structure name as the type of the object; the
predicate typep
will recognize the structure name as a
valid type specifier.
For structures defined with a :type
option,
type-of
will return a type specifier such as
list
or (vector t)
, depending on the type
specified to the :type
option. The structure name does not
become a valid type specifier. However, if the :named
option is also specified, then the first component of the structure (as
created by a defstruct
constructor function) will always
contain the structure name. This allows the structure name to be
recovered from an instance of the structure and allows a reasonable
predicate for the conceptual type to be defined: the automatically
defined name
-p
predicate for the
structure operates by first checking that its argument is of the proper
type (list
, (vector t)
, or whatever) and then
checking whether the first component contains the appropriate type
name.
Consider the binop
example shown above, modified only to
include the :named
option:
(defstruct (binop (:type list) :named)
(operator '? :type symbol)
operand-1
operand-2)
As before, this will define a constructor function
make-binop
and three selector functions
binop-operator
, binop-operand-1
, and
binop-operand-2
. It will also define a predicate
binop-p
.
The effect of make-binop
is now to construct a list of
length 4:
(make-binop :operator '+ :operand-1 'x :operand-2 5)
=> (binop + x 5)
(make-binop :operand-2 4 :operator '*)
=> (binop * nil 4)
The structure has the same layout as before except that the structure
name binop
is included as the first list element. The
selector functions binop-operator
,
binop-operand-1
, and binop-operand-2
are
essentially equivalent to cadr
, caddr
, and
cadddr
, respectively. The predicate binop-p
is
more or less equivalent to the following definition.
(defun binop-p (x)
(and (consp x) (eq (car x) 'binop)))
The name binop
is still not a valid type specifier
recognizable to typep
, but at least there is a way of
distinguishing binop
structures from other similarly
defined structures.
Next: Other Aspects of
Up: Structures of Explicitly
Previous: Unnamed
Structures
AI.Repository@cs.cmu.edu