Structures and Records

Bigloo supports two kinds of enumerated types: the structures and the records. They offer similar facilities. Structures were pre-existing to records and they are maintained mainly for backward compatiblity. Recors are compliant with the Scheme request for implementation 9.

Structures

There is, in Bigloo, a new class of objects: structures, which are equivalent to C struct.

define-struct name field...bigloo syntax

This form defines a structure with name name, which is a symbol, having fields field... which are symbols or lists, each list being composed of a symbol and a default value. This form creates several functions: creator, predicate, accessor and assigner functions. The name of each function is built in the following way: Function make-name accepts an optional argument. If provided, all the slots of the created structures are filled with it. The creator named name accepts as many arguments as the number of slots of the structure. This function allocates a structure and fills each of its slots with its corresponding argument.

If a structure is created using make-name and no initialization value is provided, the slot default values (when provided) are used to initialize the new structure. For instance, the execution of the program:

(define-struct pt1 a b)
(define-struct pt2 (h 4) (g 6))

(make-pt1)
    #{PT1 () ()}
(make-pt1 5)
    #{PT1 5 5}
(make-pt2)
    #{PT2 4 6}
(make-pt2 5)
    #{PT2 5 5}
.keep

struct? objbigloo procedure

Returns #t if and only if obj is a structure.
.keep

Records (SRFI-9)

Bigloo supports records has specified by SRFI-9. This section is a copy of the SRFI-9 specification by Richard Kelsey. This SRFI describes syntax for creating new data types, called record types. A predicate, constructor, and field accessors and modifiers are defined for each record type. Each new record type is distinct from all existing types, including other record types and Scheme's predefined types.

define-record-type expression...syntax

The syntax of a record-type definition is:

<record-type-definition> ⇒ (define-record-type <type-name>
                                         (<constructor-name> <field-tag> ...)
                                         <predicate-name>
                                         <field-spec> ...)
<field-spec>             ⇒ (<field-tag> <accessor-name>)
                           | (<field-tag> <accessor-name> <modifier-name>)
<field-tag>              ⇒ <identifier>
<accessor-name>          ⇒ <identifier>
<predicate-name>         ⇒ <identifier>
<modifier-name>          ⇒ <identifier>
<type-name>              ⇒ <identifier>
Define-record-type is generative: each use creates a new record type that is distinct from all existing types, including other record types and Scheme's predefined types. Record-type definitions may only occur at top-level (there are two possible semantics for `internal' record-type definitions, generative and nongenerative, and no consensus as to which is better).

an instance of define-record-type is equivalent to the following definitions:

Records are disjoint from the types listed in Section 4.2 of R5RS.

Seting the value of any of these identifiers has no effect on the behavior of any of their original values.

The following

(define-record-type pare
    (kons x y)
    pare?
    (x kar set-kar!)
    (y kdr))
defines kons to be a constructor, kar and kdr to be accessors, set-kar! to be a modifier, and pare? to be a predicate for pares.

  (pare? (kons 1 2))         #t
  (pare? (cons 1 2))         #f
  (kar (kons 1 2))           1
  (kdr (kons 1 2))           2
  (let ((k (kons 1 2)))
    (set-kar! k 3)
    (kar k))                 3
.keep