Next: True and False, Previous: Initial and Current Environments, Up: Scheme Concepts [Contents][Index]
Scheme is a statically scoped language with block structure. In this respect, it is like Algol and Pascal, and unlike most other dialects of Lisp except for Common Lisp.
The fact that Scheme is statically scoped (rather than dynamically bound) means that the environment that is extended (and becomes current) when a procedure is called is the environment in which the procedure was created (i.e. in which the procedure’s defining lambda expression was evaluated), not the environment in which the procedure is called. Because all the other Scheme binding expressions can be expressed in terms of procedures, this determines how all bindings behave.
Consider the following definitions, made at the top-level REP loop (in the initial environment):
(define x 1)
(define (f x) (g 2))
(define (g y) (+ x y))
(f 5) ⇒ 3 ; not 7
Here f
and g
are bound to procedures created in the
initial environment. Because Scheme is statically scoped, the call to
g
from f
extends the initial environment (the one in which
g
was created) with a binding of y
to 2
. In this
extended environment, y
is 2
and x
is 1
.
(In a dynamically bound Lisp, the call to g
would extend the
environment in effect during the call to f
, in which x
is
bound to 5
by the call to f
, and the answer would be
7
.)
Note that with static scoping, you can tell what binding a variable
reference refers to just from looking at the text of the program; the
referenced binding cannot depend on how the program is used. That is,
the nesting of environments (their parent-child relationship)
corresponds to the nesting of binding expressions in program text.
(Because of this connection to the text of the program, static scoping
is also called lexical scoping.) For each place where a variable
is bound in a program there is a corresponding region of the
program text within which the binding is effective. For example, the
region of a binding established by a lambda
expression is the
entire body of the lambda
expression. The documentation of each
binding expression explains what the region of the bindings it makes is.
A use of a variable (that is, a reference to or assignment of a
variable) refers to the innermost binding of that variable whose region
contains the variable use. If there is no such region, the use refers
to the binding of the variable in the global environment (which is an
ancestor of all other environments, and can be thought of as a region in
which all your programs are contained).
Next: True and False, Previous: Initial and Current Environments, Up: Scheme Concepts [Contents][Index]