*** PROCEDURES ***

AviosPL is a procedural language. Only 4 commands can be used outside
procedures and these are: alias, var, svar and set. If any other command
is used outside an error will be generated. As in C the language starts
executing from a procedure called "main". This must be present or the program
will not run.

Formal parameters can be passed to procedures either by value or by reference 
the latter denoted by having a star in front of the parameter name. See the 
variables documentation for more details.
Something else to note about parameters are that they can be declared as
arrays whether or not the passed variable is an array itself , also the
reverse is true and this includes pass by reference variables so you can
define a variable as an array then treat and alter it as a string in another
procedure. 

Procedures are returned from either by the "return" command or when endproc
is reached. The return command can be used to return a value from a 
procedure which is then stored in the $proc array with the array element 
name being that of the procedure called and also in the $result variable.

eg:  proc main
     call proc2 "hello"
     printnl $proc:"proc2" " is the same as " $result
     endproc

     proc proc2 h
     return "abcde"
     endproc

The $result variable provides a simpler method of accessing the returned
value but it changes after every procedure whereas the $proc array stores
the value returned from a given procedure until that procedure is next
called and returned from.

A call command cannot return the value directly because it cannot be
nested. ie you _cannot_ do the following:

proc main
printnl [call proc2]
endproc

etc...

The technical reason for this is that if call was nested (which would cause 
internal recursion with the interpreter itself) the internal recursion would 
have to be unwound , somehow its state stored on a stack and the program 
counter set to point to the new procedure. All that would have to be reversed 
when the called procedure exited. Way way too much hassle. 

Recursion is not allowed and if attempted will generate an error. This is 
because multiple copies of the same procedure cannot exist on the stack for
technical reasons. This might change in future releases. This problem must be
borne in mind when using interrupts (ie an interrupt calls a procedure which
is already on the stack), please read the interrupts file for the solution.