Raku Books / Creating a Compiler in Raku / Functions / User-defined functions

The scope of variables

Look again at the lines that save and restore the variable storage. They give our functions an important property, a local scope:

my x = 100;
func double(a) {
    my x = a * 2;
    return x;
}
say double(3); ## 6
say x; ## 100

The x inside the function and the x outside are two different variables. When a function is entered, only its parameters exist; the globals are not visible from inside. This makes Lingua functions self-contained: everything a function needs must be passed as an argument. It is a deliberate design decision. Many scripting languages choose the opposite and let the functions read the globals; you can easily get that behaviour by copying %!var instead of emptying it.

The chain of saved storages effectively forms the call stack of our language: each nested call stores one more frame, and each return restores one. We get the right behaviour for nested and, more importantly, recursive calls without any additional code.

Course navigation

← Returning a value   |   Recursion →