On this page:
top
up

5.5Copying and Updating StructuresπŸ”— i

syntax

( struct-copy idstruct-exprfld-id...)

fld-id = [field-idexpr]
| [field-id#:parentparent-idexpr]
Creates a new instance of the structure type id (which is defined via a structure type defining form such as struct ) 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 must correspond to a field-id in the structure type defining forms of id (or parent-id, if present). The accessor bindings determined by different field-ids under the same id (or parent-id, if present) 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(colorweight)#:transparent)
> (define marlin(fish'orange-and-white11))
> (define dory(struct-copy fishmarlin
[color'blue]))
> dory

(fish 'blue 11)

> (struct sharkfish(weeks-since-eating-fish)#:transparent)
> (define bruce(shark'grey1103))
> (define chum(struct-copy sharkbruce
[weight#:parentfish90]
[weeks-since-eating-fish0]))
> chum

(shark 'grey 90 0)

;subtypes can be copied as if they were supertypes,
;but the result is an instance of the supertype
> (define not-really-chum
(struct-copy fishbruce
[weight90]))
> not-really-chum

(fish 'grey 90)

top
up

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /