Previous: expander lexenv rib extending, Up: expander lexenv rib [Index]
rib
objectsA non–empty rib
can be “sealed” once all bindings are inserted.
This happens every time a syntax creates a lexical contour with a number
of syntactic bindings that is immediately known; examples are:
lambda
, let
and its variants.
To seal a rib
, we convert the lists name*
, mark**
and
label*
to vectors and insert a frequency vector in the
sealed/freq
field.
The frequency vector is a Scheme vector of fixnums: an optimisation that
allows the rib
to reorganise itself by moving frequently used tuples
towards the beginning of the vectors. This is possible because the
order in which the tuples appear in a rib
does not matter.
Let’s see how it works. An unsealed rib
holding two syntactic
bindings with source names ‘a’ and ‘b’ and the src
mark, looks as follows:
name* = (b a) mark** = ((src) (src)) label* = (lab.b lab.a) sealed/freq = #f
and right after sealing it:
name* = #(b a) mark** = #((src) (src)) label* = #(lab.b lab.a) sealed/freq = #(0 0)
the access frequencies in the sealed/freq
field are initialised
to zero; after accessing once the binding of ‘b’ in the sealed
rib
, its frequency is incremented:
name* = #(b a) mark** = #((src) (src)) label* = #(lab.b lab.a) sealed/freq = #(1 0)
and after accessing twice the binding of ‘a’ in the sealed rib
,
the tuples are swapped:
name* = #(a b) mark** = #((src) (src)) label* = #(lab.a lab.b) sealed/freq = #(2 1)
Let’s see what happens when there are multiple syntactic bindings with the same access frequency. If the scenario before the access is:
name* = #(f e d c b a) sealed/freq = #(1 1 1 0 0 0)
and we access a
: first we want the tuple of a
to be moved
in the leftmost position in the group of tuples with frequency equal to
zero:
name* = #(f e d a b c) sealed/freq = #(1 1 1 0 0 0)
we do this by swapping tuples in the vectors, in this case we swap the
tuple of a
with the tuple of c
; then we increment its
access frequency, the scenario after the access is:
name* = #(f e d a b c) sealed/freq = #(1 1 1 1 0 0)
Previous: expander lexenv rib extending, Up: expander lexenv rib [Index]