{"size": 2599, "ext": "scrbl", "max_stars_repo_path": "share/pkgs/compatibility-doc/mzlib/scribblings/struct.scrbl", "max_stars_repo_name": "takikawa/racket-ppa", "max_stars_repo_stars_event_min_datetime": "2018-07-29T04:13:52.000Z", "max_stars_repo_stars_event_max_datetime": "2022-02-14T16:11:17.000Z", "max_issues_repo_path": "compatibility-doc/mzlib/scribblings/struct.scrbl", "max_issues_repo_name": "NoahStoryM/compatibility", "max_issues_repo_issues_event_min_datetime": "2017-08-25T20:26:37.000Z", "max_issues_repo_issues_event_max_datetime": "2022-02-26T17:48:40.000Z", "max_forks_repo_path": "compatibility-doc/mzlib/scribblings/struct.scrbl", "max_forks_repo_name": "NoahStoryM/compatibility", "max_forks_repo_forks_event_min_datetime": "2015-03-09T12:20:01.000Z", "max_forks_repo_forks_event_max_datetime": "2021-10-09T05:02:56.000Z"}
{"max_stars_count": 10, "max_issues_count": 15, "max_forks_count": 8, "avg_line_length": 36.6056338028, "max_line_length": 70, "alphanum_fraction": 0.6533282032}
#lang scribble/doc
@(require "common.rkt"
          scribble/eval
          (for-label mzlib/struct
                     scheme/contract
                     (only-in scheme/base
                              regexp-try-match)))

@(define struct-eval (make-base-eval))
@interaction-eval[#:eval struct-eval (require mzscheme)]
@interaction-eval[#:eval struct-eval (require mzlib/struct)]

@mzlib[#:mode title struct]

@defform[(copy-struct struct-id struct-expr 
                      (accessor-id field-expr) ...)]{

``Functional update'' for structure instances. The result of
evaluating @racket[struct-expr] must be an instance of the structure
type named by @racket[struct-id]. The result of the
@racket[copy-struct] expression is a fresh instance of
@racket[struct-id] with the same field values as the result of
@racket[struct-expr], except that the value for the field accessed by
each @racket[accessor-id] is replaced by the result of
@racket[field-expr].

The result of @racket[struct-expr] might be an instance of a sub-type
of @racket[struct-id], but the result of the @racket[copy-struct]
expression is an immediate instance of @racket[struct-id]. If
@racket[struct-expr] does not produce an instance of
@racket[struct-id], the @racket[exn:fail:contract] exception is
raised.

If any @racket[accessor-id] is not bound to an accessor of
@racket[struct-id] (according to the expansion-time information
associated with @racket[struct-id]), or if the same
@racket[accessor-id] is used twice, then a syntax error is raised.}


@defform/subs[(define-struct/properties id (field-id ...) 
                                        ((prop-expr val-expr) ...) 
                                        maybe-inspector-expr)
              ([maybe-inspector-expr code:blank
                                     expr])]{

Like @racket[define-struct] from @racketmodname[mzscheme], but
properties can be attached to the structure type. Each
@racket[prop-expr] should produce a structure-type property value, and
each @racket[val-expr] produces the corresponding value for the
property.

@examples[
#:eval struct-eval
(define-struct/properties point (x y)
  ([prop:custom-write (lambda (p port write?)
                       (fprintf port "(~a, ~a)"
                                     (point-x p)
                                     (point-y p)))]))
(display (make-point 1 2))
]}


@defform[(make-->vector struct-id)]{

Builds a function that accepts a structure type instance (matching
@racket[struct-id]) and provides a vector of the fields of the
structure type instance.}


@close-eval[struct-eval]
