`(defstruct NAME SLOT ...)`syntaxDefines a record type with the name

`NAME`.`SLOT`may be a symbol or a list of the form`(NAME INIT)`where`INIT`is the default value of the slot (the`INIT`expression will only be evaluated when no value is given in the constructor procedure. It defaults to`#f`when none is provided).The

`defstruct`macro expands into predicate and accessor functions (just like the native`define-record`):(import defstruct) (defstruct point x y) ;; Creates code equivalent to the following: (begin (define (point? x) ...) ; is x a point? (define (point-x p) ...) ; return x slot of point p (define (point-x-set! p n) ...) ; change x slot of point p to n ...)

Additionally, a constructor procedure

`make-STRUCTNAME`is defined, which accepts initialization values for all slots specified as keyword arguments:(define p1 (make-point x: 99 y: 42)) => ; a point with x = 99 and y = 42

If keywords for some slots are missing, their initialization values default to those supplied in the

`defstruct`call, or else`#f`.There are also two procedures

`update-STRUCTNAME`and`set-STRUCTNAME!`defined for functionally and destructively updating selected values in an existing record:(define p2 (update-point p1 x: 100)) p2 => ; a point with x = 100 and y = 42 (= p1-x 99) => #t (set-point! p1 x: 100) (= p1-x 100) => #t

Finally, there are two conversion procedures for converting to and from alists,

`STRUCTNAME->alist`and`alist->STRUCTNAME`:(define p3 (alist->point '((x . 1) (y . 2)))) p3 => ; a point with x = 1 and y = 2 (define p4 (make-point x: 123 y: 456)) (point->alist p4) => ((x . 123) (y . 456))