#### 1.2.5 Variable scope ¶

By default, dummy parameters and variables which are defined in a function body before any other use are local variables. Variables (or functions) used before their definition are external variables (see Defining Procedures, see Defining a function). A variable (or function) defined outside of all functions is just that — external to all functions and local to none.

Whenever a function is called, Yorick remembers the external values of all its local variables, then replaces them by their local values. Thus, all of its local variables are potentially “visible” as external variables to any function it calls. When it returns, the function replaces all its local variables by the values it remembered. Neither that function, nor any function it calls can affect these remembered values; Yorick provides no means of “unmasking” a local variable.

The default rule for determining whether a variable should have local or external scope fails in two cases: First, you may want to redefine an external variable without looking at its value. Second, a few procedures set the values of their parameters when they return; it may appear to Yorick’s parser that such a variable has been used without being defined, even though you intend it to be local to the function. The `extern` and `local` statements solve these two problems, respectively.