chickadee » defstruct » defstruct

(defstruct NAME SLOT ...)syntax

Defines 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))