Vtables are structures that are used to represent structure types. Each
vtable contains a layout specification in field
vtable-index-layout
-- instances of the type are laid out
according to that specification. Vtables contain additional fields
which are used only internally to libguile. The variable
vtable-offset-user
is bound to a field number. Vtable fields
at that position or greater are user definable.
If you have a vtable structure, V
, you can create an instance of
the type it describes by using (make-struct V ...)
. But where
does V
itself come from? One possibility is that V
is an
instance of a user-defined vtable type, V'
, so that V
is
created by using (make-struct V' ...)
. Another possibility is
that V
is an instance of the type it itself describes. Vtable
structures of the second sort are created by this procedure:
new-fields is a layout specification describing fields
of the resulting structure beginning at the position bound to
vtable-offset-user
.
tail-size specifies the size of the tail-array (if any) of this vtable.
inits initializes the fields of the vtable. Minimally, one initializer must be provided: the layout specification for instances of the type this vtable will describe. If a second initializer is provided, it will be interpreted as a print call-back function.
;;; loading ,a... (define x (make-vtable-vtable (make-struct-layout (quote pw)) 0 'foo)) (struct? x) => #t (struct-vtable? x) => #t (eq? x (struct-vtable x)) => #t (struct-ref x vtable-offset-user) => foo (struct-ref x 0) => pruosrpwpw (define y (make-struct x 0 (make-struct-layout (quote pwpwpw)) 'bar)) (struct? y) => #t (struct-vtable? y) => #t (eq? x y) => () (eq? x (struct-vtable y)) => #t (struct-ref y 0) => pwpwpw (struct-ref y vtable-offset-user) => bar (define z (make-struct y 0 'a 'b 'c)) (struct? z) => #t (struct-vtable? z) => () (eq? y (struct-vtable z)) => #t (map (lambda (n) (struct-ref z n)) '(0 1 2)) => (a b c)
Go to the first, previous, next, last section, table of contents.