Next: stdlib records mutability, Up: stdlib records [Index]
A record is a compound data structure with a fixed number of components,
called fields. Each record has an associated type specified by a
record-type descriptor, which is an object that specifies the
fields of the record and various other properties that all records of
that type share. Record objects are created by a record
constructor, a procedure that creates a fresh record object and
initializes its fields to values. Records of different types can be
distinguished from each other and from other types of objects by
record predicates. A record predicate returns #t
when passed
a record of the type specified by the record–type descriptor and
#f
otherwise. An accessor extracts from a record the
component associated with a field, and a mutator changes the
component to a different value.
Record types can be extended via single inheritance, allowing record types to model hierarchies that occur in applications like algebraic data types as well as single–inheritance class systems. If a record type t extends another record type p, each record of type t is also a record of type p, and the predicate, accessors, and mutators applicable to a record of type p are also applicable to a record of type t. The extension relationship is transitive in the sense that a type extends its parent’s parent, if any, and so on. A record type that does not extend another record type is called a base record type.
A record type can be sealed to prevent it from being extended. Moreover, a record type can be nongenerative, i.e., it is globally identified by a “uid”, and new, compatible definitions of a nongenerative record type with the same uid as a previous always yield the same record type.
The record mechanism spans three libraries:
(rnrs records syntactic (6))
Library, a syntactic layer for defining a record type and associated constructor, predicate, accessor, and mutators.
(rnrs records procedural (6))
Library, a procedural layer for creating and manipulating record types and creating constructors, predicates, accessors, and mutators.
(rnrs records inspection (6))
Library, a set of inspection procedures.
The inspection procedures allow programs to obtain from a record instance a descriptor for the type and from there obtain access to the fields of the record instance. This facility allows the creation of portable printers and inspectors. A program may prevent access to a record’s type (and thereby protect the information stored in the record from the inspection mechanism) by declaring the type opaque. Thus, opacity as presented here can be used to enforce abstraction barriers.
Any of the standard types mentioned in this report may or may not be implemented as an opaque record type. Thus, it may be possible to use inspection on objects of the standard types.
The procedural layer is particularly useful for writing interpreters that construct host–compatible record types. It may also serve as a target for expansion of the syntactic layers. The record operations provided through the procedural layer may, however, be less efficient than the operations provided through the syntactic layer, which is designed to allow expand–time determination of record–instance sizes and field offsets. Therefore, alternative implementations of syntactic record–type definition should, when possible, expand into the syntactic layer rather than the procedural layer.
The syntactic layer is used more commonly and therefore described first. This chapter uses the rtd and constructor-descriptor parameter names for arguments that must be record–type descriptors and constructor descriptors, respectively.
Next: stdlib records mutability, Up: stdlib records [Index]