Go to the first, previous, next, last section, table of contents.


Fun With Variables

Obviously, the stack is only suited for temporary storage. Furthermore, we have already seen that using the stack too much in our code can make it cryptic. It would be very nice if we had other places to keep things... pigeonholes with little nametages, perhaps?

Our simple-minded little helper MUF is very good at "put that there" and "get item X" sorts of tasks, so this does not seem too much to expect. In fact, MUF provides two types of variables: 'global' variables and 'local' variables. (Well, there's more to the story, as we shall find when we get to 'packages', but that's enough to explain just now.)

Global variables are so called because they are visible everywhere (in the current package, at least) and in particular are visible in every function (again, in the current package, at least).

Local variables, by contrast, exist only while the particular function they are confined within is actually running -- a tiny fraction of a second, usually -- and are visible only to that particular function. Such fleeting existence might seem almost pointless at first blush, but in fact it turns out to be quite handy for functions to have private storage which they can scribble all over without upsetting anyone else.

Let's start with global variables. Notice that the next few examples have arrows with two hyphens in their name!

Stack:
"TestString" --> x
Stack:
x
Stack: "TestString"
x x x
Stack: "TestString" "TestString" "TestString" "TestString"

The --> operator takes one value off the stack, and sticks it in the variable you specify. If the variable doesn't exist, it is created. Thereafter, mentioning the variable's name is equivalent to typing in the corresponding value.

You may change the value of a variable at any time using the --> function:

Stack:
1 --> x
Stack:
x
Stack: 1
2 --> x
Stack: 1
x
Stack: 1 2

(Later, we'll see that MUF has many things other than strings and numbers for us to store in variables: vectors, lists, objects ...)

Local variables work much like global variables, but they have one less hyphen in their name, and usually make sense only inside the definition of a word, since they live only as long as their word is running:

Stack:
: double   -> string   string string join ;
Stack:
"trouble" double
Stack: "troubletrouble"
string

**** Sorry: Unrecognized identifier: 'string'

The function double takes a string and returns one twice as long, by joining two copies of it. It works by first popping the given string off the stack and into a local variable named string, then by mentioning the variable string twice and feeding the resulting two pointers to join.

Hint: It is a good idea to begin all your functions by copying all the stack values you intend to use into local variables: This lets you give them meaningful names, and usually makes the rest of the function much easier for humans to read.

Hint: Whenever you have a choice, it is better to use a local variable than a global variable. You don't know what other functions might be depending on the value of the global variable, but you certainly know no other functions depend on the value of a local variable. (Local variables are also a bit faster.) This is why we give local variables a slightly shorter assignment symbol (->) than global variables (-->): humans are lazy and tend to use the shortest-named function by preference.


Go to the first, previous, next, last section, table of contents.