71 lines
2.5 KiB
Racket
71 lines
2.5 KiB
Racket
#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]
|