Next: Initial and Current Environments, Previous: Variable Bindings, Up: Scheme Concepts
An environment is a set of variable bindings. If an environment
has no binding for a variable, that variable is said to be unbound
in that environment. Referencing an unbound variable signals a
condition of type condition-type:unbound-variable
.
A new environment can be created by extending an existing
environment with a set of new bindings. Note that “extending an
environment” does not modify the environment; rather, it
creates a new environment that contains the new bindings and the old
ones. The new bindings shadow the old ones; that is, if an
environment that contains a binding for x
is extended with a new
binding for x
, then only the new binding is seen when x
is
looked up in the extended environment. Sometimes we say that the
original environment is the parent of the new one, or that the new
environment is a child of the old one, or that the new environment
inherits the bindings in the old one.
Procedure calls extend an environment, as do let
, let*
,
letrec
, and do
expressions. Internal definitions
(see Internal Definitions) also extend an environment. (Actually,
all the constructs that extend environments can be expressed in terms of
procedure calls, so there is really just one fundamental mechanism for
environment extension.) A top-level definition (see Top-Level Definitions) may add a binding to an existing environment.