(struct-copy id struct-expr fld-id ...)
fld-id = [field-id expr] | [field-id #:parent parent-id expr]
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).