Record - the record constructor
|
Calling Sequence
|
|
Record( a, b, ... )
Record[packed]( a, b, ... )
Record[r1,r2]( a, b, ... )
Record[r1,r2,packed]( a, b, ... )
Record[record,r1,r2]( a, b, ... )
|
|
Parameters
|
|
a, b, ...
|
-
|
one or more field specifications
|
r1, r2, ...
|
-
|
one or more existing records
|
|
|
|
|
Description
|
|
•
|
The record constructor Record creates a Maple record. Records are defined by their ``field'' names, each of which must be a Maple symbol. Two records are considered to be equal if they have the same field names and if, for each slot name n, the values of the fields named n in the two records are equal.
|
•
|
Like an Array, a record is a fixed-size collection of items but, like a table, individual items are addressable by name, rather than by a numeric offset.
|
•
|
Records are implemented in Maple as modules, all of whose variables are exported. The field names are just the module exports. Records are distinguished from modules, in general, by the presence of the record option.
|
•
|
To make it easier to construct records programmatically, the symbol in a record field specifier may also be passed to the Record constructor as a string. This avoids potential evaluation of field names that correspond to an assigned global variable.
|
•
|
As a special case, you can pass a single record argument to Record, which will copy it for you. (Note that the argument will normally need to be evaluated one level, since last-name evaluation applies to variables that have a record as a value.)
|
•
|
If the Record constructor function call is indexed, the indices must specify existing record(s). The new record will inherit all the field names of the specified records. Unlike the special case of a single record argument, indices that are variables with record values will automatically be evaluated.
|
•
|
A field specifier of the form will elide the specified inherited field from the record being constructed.
|
•
|
The Record constructor function can be called with the indexed name Record[packed], which will produce a packed record.
|
|
Unlike a regular record, a packed record does not create a unique instance of each field name for each record instance. When working with thousands of similar records each with many fields, this can save a significant amount of memory and processing time.
|
|
Fields of packed records do not exhibit last-name evaluation. That is, the expression r:-a always produces a value, even if that value is a procedure, table, Matrix, Vector, or another record.
|
|
Similarly, it is not possible for a packed record field to have no value. The assigned function will always return true, and unassigning a packed record field will set its value to NULL instead.
|
|
When calling the Record constructor with one or more indices specifying existing records, the resulting record will automatically be a packed record if any of the prototype records were packed records.
|
|
This behaviour can be overridden, thus forcing the creation of non-packed records, by including the symbol record in the index of the Record constructor function.
|
•
|
Printing of records is governed by interface(max_record_depth). The setting of this interace option controls how deeply nested records are printed.
|
|
|
Compatibility
|
|
•
|
The Record command was updated in Maple 15.
|
|
|
Thread Safety
|
|
•
|
The Record command is thread-safe as of Maple 15.
|
|
|
Examples
|
|
The following statement creates a simple record r with fields a and b. Because the field names are exported, they can be accessed directly.
>
|
|
| (1) |
>
|
|
| (2) |
>
|
|
| (3) |
>
|
|
| (4) |
>
|
|
| (5) |
>
|
|
| (6) |
Records can be combined.
>
|
|
| (7) |
>
|
|
| (8) |
>
|
|
| (9) |
>
|
|
| (10) |
>
|
|
| (11) |
Specified inherited fields can be elided.
>
|
|
| (12) |
Records are useful for simple, structured data.
>
|
|
| (13) |
>
|
|
>
|
|
>
|
|
| (14) |
>
|
|
>
|
|
| (15) |
You can test the equality of two records by using a procedure such as the following. Alternatively, use the `record' option to `verify'.
>
|
receq := proc( a::record, b::record )
description "test whether two records are equal";
local e;
if { exports( a ) } = { exports( b ) } then
for e in { exports( a ) } do
if a[ e ] <> b[ e ] then
return false
end if
end do;
true
else
false
end if
end proc:
|
>
|
|
>
|
|
>
|
|
>
|
|
| (16) |
>
|
|
| (17) |
>
|
|
| (18) |
>
|
|
| (19) |
>
|
|
| (20) |
>
|
|
| (21) |
>
|
|
| (22) |
>
|
|
| (23) |
>
|
|
>
|
|
| (24) |
>
|
|
>
|
|
| (25) |
|
|