5.5 Copying and Updating Structures
(struct-copy id struct-expr fld-id ...)
|
|
fld-id | | = | | [field-id expr] | | | | | | [field-id #:parent parent-id expr] |
|
Creates a new instance of the structure type id with the same
field values as the structure produced by struct-expr, except
that the value of each supplied field-id is instead
determined by the corresponding expr. If #:parent
is specified, the parent-id must be bound to a parent
structure type of id.
The id must have a transformer binding that
encapsulates information about a structure type (i.e., like the
initial identifier bound by struct), and the binding
must supply a constructor, a predicate, and all field accessors.
Each field-id is combined with id
(or parent-id, if present) to form
id-field-id (using the lexical
context of field-id), which must be one of the accessor
bindings in id. The accessor bindings determined by different
field-ids must be distinct. The order of the
field-ids need not match the order of the corresponding
fields in the structure type.
The struct-expr is evaluated first. The result must be an
instance of the id structure type, otherwise the
exn:fail:contract exception is raised. Next, the field exprs are
evaluated in order (even if the fields that correspond to the
field-ids are in a different order). Finally, the new
structure instance is created.
The result of struct-expr can be an instance of a sub-type of
id, but the resulting copy is an immediate instance of
id (not the sub-type).
Examples:
> (struct fish (color weight) #:transparent) |
|
> (define marlin (fish 'orange-and-white 11)) |
|
|
|
> dory |
(fish 'blue 11) |
> (struct shark fish (weeks-since-eating-fish) #:transparent) |
|
> (define bruce (shark 'grey 110 3)) |
|
> (define chum (struct-copy shark bruce | [weight #:parent fish 90] | [weeks-since-eating-fish 0])) |
|
|
> chum |
(shark 'grey 90 0) |
; subtypes can be copied as if they were supertypes, |
; but the result is an instance of the supertype |
|
|
> not-really-chum |
(fish 'grey 90) |