MOP
See the Guide for an introduction to Gerbil's object system. These procedures provide the meta-object protocol.
make-object
(make-object class fields) -> object
  class  := type-descriptor; the class of the constructed object
  fields := the number of fields in the object
Creates an object with class class and fields fields.
object?
(object? obj) -> boolean
  obj := any object
Returns true if obj is an object instance.
object-type
(object-type obj) -> type
  obj := any object
Returns the class of an object; obj must be an object instance.
type-descriptor?
(type-descriptor? obj) -> boolean
  obj := any object
:::
Returns true if obj is a runtime type descriptor.
struct-type?
(struct-type? obj) -> boolean
  obj := any object
:::
Returns true if obj is a struct type descriptor.
class-type?
(class-type? obj) -> boolean
  obj := any object
Returns true if obj is a class type descriptor.
struct-subtype?
(struct-subtype? a b) -> boolean
  a, b := type-descriptor
Returns true if b is a struct subtype of a; a and b must be type descriptors.
This procedures checks the inheritance chain of b; b is a struct subtype of a if it is included in b's inheritance chain.
class-subtype?
(class-subtype? a b) -> boolean
  a, b := type-descriptor
Returns true if b is a class subtype of a; a and b must be type descriptors.
This procedures checks the linearized mixin list of b; b is a class subtype of a if it is included in b's mixins.
direct-instance?
(direct-instance? klass obj) -> boolean
  klass := type-descriptor
Returns true if obj is an immediate instance of klass.
struct-instance?
(struct-instance? klass obj) -> boolean
  klass := type-descriptor
  obj   := any object
Returns true if obj is a struct instance of klass.
This procedures checks the inheritance chain of obj's type; obj is a struct instance of klass if it is an object and its type is includes klass in its inheritance chain.
direct-struct-instance?
(direct-struct-instance? klass obj) -> boolean
  klass := type-descriptor
  obj   := any object
Same as (direct-instance? klass obj).
class-instance?
(class-instance? klass obj) -> boolean
  klass := type-descriptor
  obj   := any object
Returns true if obj is a class instance of klass.
This procedures checks the linearized mixin list of obj's type; obj is a class instance of klass if it is an object and its type is includes klass in its mixin list.
direct-class-instance?
(direct-class-instance? klass obj) -> boolean
  klass := type-descriptor
  obj   := any object
Same as (direct-instance? klass obj).
make-struct-type
(make-struct-type id super fields name plist ctor [field-names = #f]) -> type-descriptor
  id          := symbol; the type id
  super       := type-descriptor or #f; the struct type to inherit from
  fields      := fixnum; number of (new) fields in the type
  name        := symbol; the (displayed) type name
  plist       := alist; type properties
  ctor        := symbol or #f; id of constructor method
  field-names := list of symbols or #f; (displayed) field names
plist elements:
 (transparent: . boolean) ; controls whether the object is transparent
                            in equality and printing
 (final: . boolean)       ; controls whether the class if final
 (print: field ...)       ; printable field names
 (equal: field ...)       ; equality comparable field names
Creates a new struct type descriptor.
make-struct-predicate
(make-struct-predicate klass) -> procedure
  klass := type-descriptor
:::
Creates a struct instance predicate for instances of klass.
make-struct-field-accessor
(make-struct-field-accessor klass field) -> procedure
  klass := type-descriptor
  field := fixnum
Creates a klass instance accessor for field field (relative to super).
make-struct-field-mutator
(make-struct-field-mutator klass field) -> procedure
  klass := type-descriptor
  field := fixnum
Creates a klass instance mutator for field field (relative to super).
make-struct-field-unchecked-accessor
(make-struct-field-unchecked-accessor klass field) -> procedure
  klass := type-descriptor
  field := fixnum
Like make-struct-field-accessor, but the accessor is unchecked.
make-struct-field-unchecked-mutator
(make-struct-field-unchecked-mutator klass field) -> procedure
  klass := type-descriptor
  field := fixnum
Like make-struct-field-mutator, but the mutator is unchecked.
make-struct-instance
(make-struct-instance klass . args) -> object
  klass := type-descriptor
  args  := rest of arguments
Creates a new instance of klass. If there is a constructor method, it will be invoked with args on a freshly allocated object. Otherwise, the object is initialized with args, which must have the same length as the struct has fields.
struct-instance-init!
(struct-instance-init! obj . args)
  obj  := any object
  args := rest of arguments
Initializes obj by setting its fields to args from left to right. If there are more fields than arguments, then they are left uninitialized. It is an error if there are more arguments than fields in the object.
struct-field-offset
(struct-field-offset klass field) -> fixnum
  klass := type-descriptor
  field := fixnum
Returns the absolute field offset for klass's field field.
struct-field-ref
(struct-field-ref klass obj off) -> any
  klass := type-descriptor
  obj   := instance of klass
  off   := fixnum; absolute field offset
:::
Accesses obj's field with absolute offset off; obj is checked to be an instance of klass.
struct-field-set!
(struct-field-set! klass obj off val) -> void
  klass := type-descriptor
  obj := instance of klass
  off := fixnum; absolute field offset
  val := any
Mutates obj's field with absolute offset off to val; obj is checked to be an instance of klass.
unchecked-field-ref
(unchecked-field-ref obj off) -> any
  obj := instance of klass
  off := fixnum; absolute field offset
Accesses obj's field with absolute offset off; there is no type check.
unchecked-field-set!
(unchecked-field-set! obj off val) -> void
Mutates obj's field with absolute offset off to val; there is no type check.
struct->list
(struct->list obj) -> list
  obj := any object
Converts obj to a list, which conses its type and to its fields.
make-class-type
(make-class-type id super slots name plist ctor) -> type-descriptor
  id     := symbol; the type id
  super  := list of type-descriptors or #f; super types
  slots  := list of symbols; class slot names
  plist  := alist; type properties
  ctor   := symbol or #f; id of constructor method
plist elements:
 (transparent: . boolean) ; controls whether the object is transparent
                            in equality and printing
 (final: . boolean)       ; controls whether the class if final
 (print: slot ...)        ; printable slots
 (equal: slot ...)        ; equality comparable slots
Creates a new class type descriptor.
make-class-predicate
(make-class-predicate klass) -> procedure
  klass := type-descriptor
Creates a class instance predicate for instances of klass.
make-class-slot-accessor
(make-class-slot-accessor klass slot) -> procedure
  klass := type-descriptor
  slot  := symbol
Creates a slot accessor for slot.
make-class-slot-mutator
(make-class-slot-mutator klass slot) -> procedure
  klass := type-descriptor
  slot  := symbol
Creates a slot mutator for slot.
make-class-slot-unchecked-accessor
(make-class-slot-unchecked-accessor klass slot) -> procedure
  klass := type-descriptor
  slot  := symbol
Like make-class-slot-accessor, but creates an unchecked accessor.
make-class-slot-unchecked-mutator
(make-class-slot-unchecked-mutator klass slot) -> procedure
  klass := type-descriptor
  slot  := symbol
Like make-class-slot-mutator, but creates an unchecked mutator.
make-class-instance
(make-class-instance klass . args) -> object
  klass := type-descriptor
  args  := rest of arguments
Creates a new instance of klass. If there is a constructor method, it will be invoked with args on a freshly allocated object. Otherwise, the object is initialized with args, which must be a plist of slot keywords/symbols and values.
class-instance-init!
(class-instance-init! obj . args)
  obj  := any object
  args := rest of arguments
Initializes obj, using args as a plist of slot keywords/symbols and values. For every slot and value in the plist, the corresponding object slot is set to the value.
class-slot-offset
(class-slot-offset klass slot) -> fixnum
  klass := type-descriptor
  slot  := symbol or keyword
Returns the absolute field offset for slot in instances of klass.
class-slot-ref
(class-slot-ref klass obj slot) -> any
  klass := type-descriptor
  obj   := instance of klass
  slot  := symbol or keyword
Checks that obj is a class instance of klass and returns the value in slot slot.
class-slot-set!
(class-slot-set! klass obj slot val) -> void
  klass := type-descriptor
  obj   := instance of klass
  slot  := symbol or keyword
  val   := any
Checks that obj is a class instance of klass and sets the value in the slot slot to val.
slot-ref
(slot-ref obj slot [E = slot-error]) -> any
  obj  := object
  slot := symbol or keyword
  E    := procedure
Returns the value associated with slot slot in obj.
If the object has no such slot, then E is invoked in tail position as (E obj slot).
By default, this raises an error.
slot-set!
(slot-set! obj slot val [E = slot-error]) -> void
  obj  := object
  slot := symbol or keyword
  val  := any
  E    := procedure;
Sets the value associated with slot slot in obj to val.
If the object has no such slot, then E is invoked in tail position as (E obj slot).
By default, this raises an error.
unchecked-slot-ref
(unchecked-slot-ref obj slot) -> any
  obj  := object
  slot := symbol or keyword
Returns the value associated with slot slot in obj, without any checks.
unchecked-slot-set!
(unchecked-slot-set! obj slot val) -> void
  obj  := object
  slot := symbol or keyword
  val  := any
Sets the value associated with slot slot in obj to val, without any checks.
class->list
(class->list obj)
  obj := any object
Converts obj to a list, which conses its type and to a plist of slot keywords and values.
bind-method!
(bind-method! klass id proc [rebind? = #t]) -> void
  klass   := type-descriptor or builtin record descriptor
  id      := symbol; method id
  proc    := procedure; method implementation
  rebind? := boolean; allow method rebinding?
Binds proc as the method with id in class klass.
call-method
(call-method obj id . args) -> any
  obj  := any object
  id   := symbol; method id
  args := rest of arguments
Applies the method with id in obj to args, with the object itself as the first argument. Raises an error if the object has no such method bound.
find-method
(find-method klass id) -> procedure | #f
  klass := type-descriptor or builtin record descriptor
  id    := symbol; method id
Looks up the method with id in klass class. Returns the procedure
implementing the method or #f if the method is not bound in the class
hierarchy.
call-next-method
(call-next-method klass obj id . args) -> any
  klass := type-descriptor or builtin record descriptor
  obj   := object
  id    := symbol; method id
Invokes the next method in obj's hierarchy, following klass.
next-method
(next-method klass obj id) -> procedure | #f
  klass := type-descriptor or builtin record descriptor
  obj   := object
  id    := symbol; method id
Returns the next method in obj's hierarchy, following klass.
method-ref
(method-ref obj id) -> procedure | #f
  obj := object
  id  := symbol; method id
Looks up the method with id in obj's hierarchy.
bound-method-ref
(bound-method-ref obj id) -> procedure | #f
  obj := object
  id  := symbol; method id
Looks up the method with id in obj's hierarchy and returns a procedure which applies the method currying the object.
checked-method-ref
(checked-method-ref obj id) -> procedure | #f
  obj := object
  id  := symbol; method id
Like method-ref, but raises an error if the method is not found.
checked-bound-method-ref
(checked-bound-method-ref obj id) -> procedure | #f
  obj := object
  id  := symbol; method id
Like bound-method-ref, but raises an error if the method is not found.
direct-method-ref
(direct-method-ref klass id) -> procedure | #f
  klass := type-descriptor
  id    := symbol; method id
Returns the binding of method with id in class klass.
seal-class!
(seal-class! klass) -> unspecified
  klass := type-descriptor
Seals a class, which must be final. Sealing a class specializes and coalesces all methods in the hierarchy to the class' method table.
bind-specializer!
(bind-specializer! method specializer) -> unspecified
  method      := procedure implementing a method
  specializer := procedure of one argument that returns the specialized method
Binds a specializer procedure associated with a method. When a class is sealed, the specializer is invoked with the concrete class to generate a version of the method that is specialized for the concrete class.