For each LAMBDA-expression which must be closed, three sets of variables
are computed: (1) the variables which will already be in the "consed"
environment structure at the time the closure is to be created; (2) additional
variables which must be added ("consed on") to the existing structure to create
the closure (because at that point they are spread out in "registers") {Note
Heap-Allocated Contours}; (3) variables which must be added to the environment
immediately after entering the function because they must eventually be added in
for closures later and they are referred to in ASET' constructs. The third set
arises from a requirement that ASET' constructs must have a consistent effect,
and confusion can arise if a variable's value can be in more than one place. If
the value were allowed to be both in a "register" and in an environment
structure, or in several different environment structures, then altering the
value in one place would not affect the other places. To assure consistency,
this third set is computed, and such variables must at run time be placed in an
environment structure to be shared by all others which refer to such variables.
For every LABELS statement a set of variables is computed which is the
set of variables to be added to the existing environment on entry to the LABELS
body, in order to share this new structure among all the closures to be created
for the LABELS functions.