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). The defstruct macro expands into predicate and accessor functions (just like the native define-record):

(require-extension defstruct)

(defstruct point x y)

;; Creates code equivalent to the following:
  (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

On Chicken 4 and higher, 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))
 => ; a point with x = 100 and y = 42

(= p1-x 99)
 => #t

(set-point! p1 x: 100)
(= p1-x 100)
 => #t

Additionally, there are two conversion procedures for converting to and from alists, STRUCTNAME->alist and alist->STRUCTNAME:

(define p3 (alist->point '((x . 1) (y . 2))))
 => ; a point with x = 1 and y = 2

(define p4 (make-point x: 123 y: 456))
(point->alist p4)
 => ((x . 123) (y . 456))