Scope rules define the visibility rules for names in a
programming language. What if you have references to a variable named
k in different parts of the program? Do these refer to the
same variable or to different ones?
Most languages, including Algol, Ada, C, Pascal, Scheme, and Miranda, are statically scoped. A block defines a new scope. Variables can be declared in that scope, and aren't visible from the outside. However, variables outside the scope -- in enclosing scopes -- are visible unless they are overridden. In Algol, Pascal, Miranda, and Scheme (but not C or Ada) these scope rules also apply to the names of functions and procedures.
Static scoping is also sometimes called lexical scoping.
begin
integer m, n;
procedure hardy;
begin
print("in hardy -- n = ", n);
end;
procedure laurel(n: integer);
begin
print("in laurel -- m = ", m);
print("in laurel -- n = ", n);
hardy;
end;
m := 50;
n := 100;
print("in main program -- n = ", n);
laurel(1);
hardy;
end;
The output is:
in main program -- n = 100 in laurel -- m = 50 in laurel -- n = 1 in hardy -- n = 100 /* note that here hardy is called from laurel */ in hardy -- n = 100 /* here hardy is called from the main program */
Blocks can be nested an arbitrary number of levels deep.
in main program -- n = 100 in laurel -- m = 50 in laurel -- n = 1 in hardy -- n = 1 ;; NOTE DIFFERENCE -- here hardy is called from laurel in hardy -- n = 100 ;; here hardy is called from the main program