Common Lisp the Language, 2nd Edition
Next: Named Structures
Up: Structures of Explicitly
Previous: Structures of
Explicitly
Sometimes a particular data representation is imposed by external
requirements, and yet it is desirable to document the data format as a
defstruct
-style structure. For example, consider
expressions built up from numbers, symbols, and binary operations such
as +
and *
. An operation might be represented
as it is in Lisp, as a list of the operator and the two operands. This
fact can be expressed succinctly with defstruct
in this
manner:
(defstruct (binop (:type list))
(operator '? :type symbol)
operand-1
operand-2)
This will define a constructor function make-binop
and
three selector functions, namely binop-operator
,
binop-operand-1
, and binop-operand-2
. (It will
not, however, define a predicate binop-p
, for
reasons explained below.)
The effect of make-binop
is simply to construct a list
of length 3:
(make-binop :operator '+ :operand-1 'x :operand-2 5)
=> (+ x 5)
(make-binop :operand-2 4 :operator '*)
=> (* nil 4)
It is just like the function list
except that it takes
keyword arguments and performs slot defaulting appropriate to the
binop
conceptual data type. Similarly, the selector
functions binop-operator
, binop-operand-1
, and
binop-operand-2
are essentially equivalent to
car
, cadr
, and caddr
,
respectively. (They might not be completely equivalent because, for
example, an implementation would be justified in adding error-checking
code to ensure that the argument to each selector function is a length-3
list.)
We speak of binop
as being a ``conceptual’’ data type
because binop
is not made a part of the Common Lisp type
system. The predicate typep
will not recognize
binop
as a type specifier, and type-of
will
return list
when given a binop
structure.
Indeed, there is no way to distinguish a data structure constructed by
make-binop
from any other list that happens to have the
correct structure.
There is not even any way to recover the structure name
binop
from a structure created by make-binop
.
This can be done, however, if the structure is ``named.’’
Next: Named Structures
Up: Structures of Explicitly
Previous: Structures of
Explicitly
AI.Repository@cs.cmu.edu