manpagez: man pages & more
info bigloo
Home | html | info | man
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2 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.

syntax: define-record-type expression…

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:

  • <type-name> is bound to a representation of the record type itself. Operations on record types, such as defining print methods, reflection, etc. are left to other SRFIs.
  • <constructor-name> is bound to a procedure that takes as many arguments as the re are <field-tag>s in the (<constructor-name> ...) subform and returns a new <type-name> record. Fields whose tags are listed with <constructor-name> have the corresponding argument as their initial value. The initial values of all other fields are unspecified.
  • <predicate-name> is a predicate that returns #t when given a value returned by <constructor-name> and #f for everything else.
  • Each <accessor-name> is a procedure that takes a record of type <type-name> and returns the current value of the corresponding field. It is an error to pass an accessor a value which is not a record of the appropriate type.
  • Each <modifier-name> is a procedure that takes a record of type <type-name> and a value which becomes the new value of the corresponding field; an unspecified value is returned. It is an error to pass a modifier a first argument which is not a record of the appropriate type.

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

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on March 31, 2014 using texi2html 5.0.

© manpagez.com 2000-2024
Individual documents may contain additional copyright information.