Most people seem to think that "var" in Nasal is a kind of
redundant decoration, and really just noise. It isn't.
In fact, I consider Nasal code *not* using it broken.


"var" makes a variable guaranteed to be local. And note that
functions assigned to variables are no exception! If you write
code without using "var" on variables, then you risk (often
hard to debug) breakage at a later time. Consider this code
in one of your scripts:

 output = func(v) {                        # missing "var"
     state = getprop("/sim/foo/state");    # missing "var"
     do_something(state, v);
 }


where neither "output" nor "state" have been declared to
be a local variable using "var" in this file. Everything will
work fine. For a while. Until someone creates a file
$FG_ROOT/Nasal/state.nas or $FG_ROOT/Nasal/output.nas.
Then your "output" and "state" will no longer create
a safe variable, but they'll overwrite the global namespaces
that these files meant to create. You can try this with these
examples:


 props = func {                            # missing "var"
     print("I'm props. And I just wiped the whole props namespace.");
 }


Or with this:


 foo = func {                              # missing "var"
     props = " :-P ";                      # missing "var"
 }
 ...
 foo();


After this code was run, all props methods will stop working,
as the props namespace containing all the important stuff was
replaced by cheesy, thought to be local stuff.

Note, again, that variables set to hold a function object are
no exception. They should use the "var" keyword as well:

  var foo = func {}


But there's another reason why "var" should be used consequently,
even if a variable is safe enough from later side effects, because
it's called "bo105_livery" or something. The "var" keyword makes
reading code for others (and for the author after some time) easier,
as it makes clear: "this variable starts its life *HERE*". No need
to search around to see whether assigning a value to it means
something to other code outside or not. Also, with an editor
offering proper syntax highlighting reading such code is actually
easier, despite the "noise".

But why then does some code still not use "var", even code written
by Andy? Because the keyword didn't exist from the beginning. It was
added after I had run into weird error messages when starting with
the bo105. It took me a while to find out that a variable "state"
had nasty and unexpected side effects on the $FG_ROOT/Nasal/state.nas
script. And now you know why this script is now known as "ac_state.nas".

m.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to