record, declare record


declare abstract? record record-type-name (extends record-type-name)?
   ((field field declaration)* | elsewhere)


You can use declare record to declare a record type.

Here is how you would declare a record type to hold a simple metadata record for a document:

  declare record document-metadata-type
     field string  author
     field string  title
     field string  publisher
     field integer year
     field switch  in-print initial {true}

Each field in the record is itself of a particular type and is declared just as a local variable of that type would be declared, substituting the word field for the word local. Each field in a record is itself a shelf.

A record declaration by itself simply defines a record type. To create a record you must create a shelf of the record type.

A record can be declared as an extension of another record type, using extends:

  declare record book-metadata-type extends document-metadata-type
     field string isbn-number

An extended record type inherits the fields of its base type.

A record can be declared abstract by prefixing the keyword record with the keyword abstract. An abstract record cannot be instantiated, but can only be extended.

The keyword elsewhere can be used to make the record name and some of the properties available without defining all of the record's properties.