quakeforge/doc/gib/GIB.lyx
Bill Currie 997102fea8 audit the usage of "only"
There are still a few iffy places (notably around certain prepositions), but
the relevant sentences are now much easier to read.
2010-01-13 06:42:26 +00:00

2080 lines
38 KiB
Text

#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass article
\begin_preamble
\usepackage{ae,aecompl}
\end_preamble
\language english
\inputencoding auto
\fontscheme default
\graphics default
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
\begin_inset Graphics
filename gib_head.eps
\end_inset
\newline
\family sans
\series bold
The GIB Scripting Language
\layout Author
Brian Koropoff
\layout Standard
\pagebreak_top \pagebreak_bottom
\begin_inset LatexCommand \tableofcontents{}
\end_inset
\layout Section
Introduction
\layout Subsection
Purpose and Applications
\layout Standard
GIB
\begin_inset Foot
collapsed false
\layout Standard
\noun on
GIB
\noun default
stands for
\begin_inset Quotes eld
\end_inset
\series bold
G
\series default
IB
\series bold
I
\series default
sn't
\series bold
\noun on
B
\series default
ash
\noun default
.
\begin_inset Quotes erd
\end_inset
\noun on
Bash
\noun default
is the
\noun on
GNU
\noun default
implementation of the UNIX shell, with which GIB shares many similarities.
\end_inset
is a scripting language first introduced in
\noun on
QuakeForge
\noun default
0.5.2, although it existed in several (less successful) incarnations in the
CVS development tree before finding its way into a release.
I created it out of frustration at the limited abilities of the standard
\noun on
Quake
\noun default
console for client-side scripting.
The language that resulted now has applications ranging from glorified
aliases to server-side chat bots and map voting scripts.
\layout Subsection
Features
\layout Standard
Some of GIB's more noteworthy features include:
\layout Itemize
Full branching and looping support, including
\family typewriter
if-else
\family default
,
\family typewriter
while
\family default
, and
\family typewriter
for
\family default
structures.
\layout Itemize
Local and global variables, arrays, and hashes (all rolled into one, see
Section
\begin_inset LatexCommand \vref{sec:variables}
\end_inset
for details) as well as access to standard console variables.
\layout Itemize
A full-featured math evaluator supporting correct order of operations and
most arithmetic, logical, and bitwise operators.
\layout Itemize
Functions that can be passed any number of arguments and return any number
of values to the caller.
\layout Itemize
File and directory access.
\layout Itemize
String manipulation functions, including regular expressions.
\layout Itemize
\begin_inset Quotes eld
\end_inset
Cooperative
\begin_inset Quotes erd
\end_inset
threading.
\layout Itemize
An event system, wherein GIB functions can be run when a certain event occurs,
such as a chat message being received or the player's health changing.
\layout Itemize
Integration with the console.
Console commands can be used from GIB, and GIB functions can be
\begin_inset Quotes eld
\end_inset
exported
\begin_inset Quotes erd
\end_inset
to the console as normal commands.
\layout Section
\pagebreak_top
Language Basics
\layout Subsection
Command Syntax
\layout Standard
GIB follows the same syntax for basic commands as the standard Quake console:
the command, followed by any number of spaces and a space-separated list
of arguments.
Consider the following console command, which is also a legitimate GIB
command:
\layout LyX-Code
echo Hello world!
\layout Standard
Each command is usually placed on a separate line, but a semicolon (
\family typewriter
;
\family default
) may be used to separate multiple commands on a single line:
\layout LyX-Code
echo This is a command; echo ...and so is this!
\layout Subsection
Enclosing Arguments
\layout Standard
A normal argument is considered to end at the first
\begin_inset Quotes eld
\end_inset
whitespace
\begin_inset Quotes erd
\end_inset
character or comma (see Section
\begin_inset LatexCommand \ref{sub:concat}
\end_inset
) encountered.
Arguments may be optionally enclosed in certain characters to either define
their boundaries or specify special processing to be done before the command
is run.
\layout Subsubsection
Double Quotes
\layout Standard
An argument may be enclosed in double quotes (
\family typewriter
"
\family default
and
\family typewriter
"
\family default
, never smart quotes!), in which case the argument consists of all characters
within the quotes, including any spaces.
For example:
\layout LyX-Code
print "Hello, world!"
\layout Standard
\added_space_bottom bigskip
In addition, special processing is done to arguments in quotes to allow
the inclusion of characters that can't normally be typed.
If a character is preceded by a backslash (
\family typewriter
\backslash
\family default
), the backslash and the character will be replaced with a special character.
This is referred to as
\begin_inset Quotes eld
\end_inset
escaping.
\begin_inset Quotes erd
\end_inset
Figure
\begin_inset LatexCommand \vref{cap:escapes}
\end_inset
lists possible characters and their replacements.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
<lyxtabular version="3" rows="6" columns="2">
<features>
<column alignment="center" valignment="top" leftline="true" width="0in">
<column alignment="left" valignment="top" leftline="true" rightline="true" width="0in">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
Character
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Replacement
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\family typewriter
n
\end_inset
</cell>
<cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Newline
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\family typewriter
t
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Tab
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\family typewriter
r
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Carriage return
\end_inset
</cell>
</row>
<row topline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\family typewriter
"
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Double quote (does not end argument)
\end_inset
</cell>
</row>
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
\family typewriter
\backslash
\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text
\layout Standard
Backslash (does not escape next character)
\end_inset
</cell>
</row>
</lyxtabular>
\end_inset
\layout Caption
Escape characters
\begin_inset LatexCommand \label{cap:escapes}
\end_inset
\end_inset
\layout Standard
\added_space_top bigskip
The preceding code example could be rewritten to include a newline character
so that printing will continue on the next line:
\layout LyX-Code
print "Hello, world!
\backslash
n"
\layout Standard
\added_space_bottom bigskip
Besides a single character, a backslash can be followed by three digits
forming a decimal number between 0 and 255, in which case the backslash
and all digits are replaced by the character with the value of the number.
\layout Standard
\line_top \line_bottom \align left
\series bold
\color red
Warning
\color default
:
\series default
\emph on
Attempting to send any string with the character of decimal value 255 over
the network will result in a malformed packet and an immediate loss of
connection.
Do not use
\family typewriter
"
\backslash
255"
\family default
in any chat message, info string, or any other text sent between the client
and server.
\layout Standard
\added_space_top bigskip
Double quotes must be evenly matched, or a parse error will be issued when
GIB attempts to execute the script.
\layout Subsubsection
Parentheses
\layout Standard
An argument may be enclosed within parentheses, in which case the argument
will be evaluated as a mathematical expression and will be replaced with
the result of that expression.
Consider the following code:
\layout LyX-Code
echo (1/(1+1))
\layout Standard
This will result in
\begin_inset Quotes eld
\end_inset
0.5
\begin_inset Quotes erd
\end_inset
being printed.
For a detailed explanation of the capabilities of the math evaluator, please
see Section .
As with double quotes, parentheses must be evenly matched or a parse error
will be issued.
\layout Subsubsection
Curly Braces
\layout Standard
Arguments within curly braces (
\family typewriter
{
\family default
and
\family typewriter
}
\family default
) are treated as
\emph on
program blocks
\emph default
, or groups of GIB commands.
To facilitate readable formatting of code, line breaks are allowed within
curly braces.
Curly braces should be used only where GIB code is appropriate, such as
in a loop or function definitions.
Arguments in curly braces
\emph on
may
\emph default
be used for any purpose, but this comes with two drawbacks:
\layout Enumerate
Arguments in curly braces are considered code and will be held to those
standards.
Parse errors within curly braces will prevent execution of your script,
even if the argument is not used where a program block is requested.
\layout Enumerate
The GIB parser will convert code in curly braces to an internal representation,
which is a waste of time and resources if the argument is never used as
a program block.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{curly.gib}
preview false
\end_inset
\layout Caption
Example uses of curly braces
\begin_inset LatexCommand \label{cap:curly}
\end_inset
\end_inset
\layout Standard
Figure
\begin_inset LatexCommand \vref{cap:curly}
\end_inset
uses features that will be discussed later, but it demonstrates several
of the intended uses of curly braces.
\layout Subsection
Concatenation
\begin_inset LatexCommand \label{sub:concat}
\end_inset
\layout Standard
Concatenation refers to joining one argument onto the end of another.
This is useful when you want to combine different arguments into one, such
as a double-quoted argument and a math expression.
To do this, simply place a single comma (
\family typewriter
,
\family default
) anywhere between arguments.
Example:
\layout LyX-Code
print "20 divided by 4 is ", (20/4), "
\backslash
n"
\layout Standard
Concatenation will not work with curly-brace-enclosed arguments.
In addition, it will not work or simply be ignored on instances of variable
expansion, which will be discussed in Section
\begin_inset LatexCommand \ref{sec:variables}
\end_inset
.
\layout Subsection
Comments
\layout Standard
GIB uses the same format for comments as the console.
Any text between two forward slashes (
\family typewriter
//
\family default
) and the end of the current line will be discarded when the script is parsed.
To use two forward slashes without starting a comment, enclose the argument
in double quotes.
Example:
\layout LyX-Code
echo "Hello" // This is a comment
\layout LyX-Code
echo "// This is not a comment"
\layout Standard
Proper use of comments in your scripts will make them easier to read and
understand.
\layout Section
\pagebreak_top
Variables
\begin_inset LatexCommand \label{sec:variables}
\end_inset
\layout Subsection
Types and Concepts
\layout Standard
GIB offers several powerful forms of variables:
\layout Description
Console\SpecialChar ~
variables hold a character string and can also be accessed from the
\noun on
QuakeForge
\noun default
console.
\layout Description
Standard\SpecialChar ~
variables hold a character string.
\layout Description
Arrays hold a numbered list of character strings, each referred to as an
\emph on
element
\emph default
.
\layout Description
Hashes hold a list of arrays, each referenced by a unique name called a
\emph on
key
\emph default
.
\layout Standard
Unlike many other languages, these different types of variables are not
defined separately.
Rather, all non-console GIB variables are a hash/array hybrid.
Every variable is an array, and every element in that array also can be
a hash.
This may sound confusing at first, but it is actually quite intuitive and
powerful.
\layout Standard
Variables in GIB can be used in three different ways:
\layout Itemize
\series bold
Assignment
\series default
\newline
A value (character string) is stored in the variable.
\layout Itemize
\series bold
Embedding
\series default
\newline
The value of a variable is placed somewhere within an argument.
\layout Itemize
\series bold
Expansion
\series default
\newline
A new argument is created in the command for each element of an array or
each key in a hash.
\layout Standard
Note that console variables cannot be expanded, as they may hold only one
value.
\layout Subsection
Console Variables
\layout Standard
Console variables are the normal settings used at the
\noun on
QuakeForge
\noun default
console, such as
\family typewriter
in_mouse_amp
\family default
,
\family typewriter
fov
\family default
, etc.
These are the simplest variables available to GIB.
\layout Subsubsection
Assigning to Console Variables
\layout Standard
To assign to a console variable from GIB, simply use the
\family typewriter
set
\family default
console command with the name of the console variable as the first argument
and the value to assign as the second.
Example:
\layout LyX-Code
set fov 90.0
\layout Subsubsection
Embedding Console Variables
\layout Standard
To embed the value of a console variable in an argument, include the name
of the variable preceded by a dollar sign (
\family typewriter
$
\family default
).
This works only within normal arguments or parenthesis-enclosed arguments.
Examples:
\layout LyX-Code
echo The current field of vision is $fov degrees.
\layout LyX-Code
echo Zoom factor: (90.0/$fov)
\layout Standard
The name of the variable is considered to span from after the dollar sign
to before the first non-alphanumeric, non-underline character.
Example:
\layout LyX-Code
echo Your mouse sensitivity is currently $in_mouse_amp.
\layout Standard
The command above will result in the current mouse sensitivity being printed,
as
\family typewriter
in_mouse_amp
\family default
consists of only letters and underlines.
The period at the end of the sentence is not a number, letter, or underline,
and thus is not counted as part of the variable name, even though it is
part of the last argument.
\layout Standard
To use variables with unusual names, or to separate the name of a variable
from surrounding alphanumeric characters, enclose the name of the variable
in curly braces.
Examples:
\layout LyX-Code
echo /
\backslash
/
\backslash
/
\backslash
has the value ${/
\backslash
/
\backslash
/
\backslash
}.
\layout LyX-Code
echo Fieldofvisionis${fov}degrees.Wheredidmyspacebargo?
\layout Standard
Variables that do not exist are considered to contain an empty string.
\layout Subsection
Standard Variables
\begin_inset LatexCommand \label{sub:stdvars}
\end_inset
\layout Standard
As noted before, all non-console GIB variables are also arrays.
However, their array properties can be ignored for simplicity, in which
case the first element of an array is used for storing and retrieving a
value.
\layout Subsubsection
Assigning to Standard Variables
\begin_inset LatexCommand \label{sub:assignstandard}
\end_inset
\layout Standard
To assign to a standard variable, begin a command with the name of the variable,
followed by at least one space and an equals (
\family typewriter
=
\family default
) sign, followed by any non-program-block argument.
Example:
\layout LyX-Code
foo = "bar"
\layout Standard
The above example will store
\begin_inset Quotes eld
\end_inset
bar
\begin_inset Quotes erd
\end_inset
in the variable
\family typewriter
foo
\family default
.
\layout Subsubsection
Embedding Standard Variables
\layout Standard
Standard variables are embedded the same way as console variables: a dollar
sign, followed by the name of the variable or the name of the variable
in curly braces.
To display the stored value in the example in Section
\begin_inset LatexCommand \ref{sub:assignstandard}
\end_inset
, simply do:
\layout LyX-Code
echo $foo
\layout Subsection
Arrays
\layout Standard
Arrays are simply an extension of standard variables.
They are divided into numbered elements beginning at 0.
\layout Subsubsection
Assigning to Arrays
\layout Standard
Assignment to arrays is the same as assignment to standard variables, except
that you specify the element of the array to which you wish to assign.
In fact, all standard variables
\emph on
are
\emph default
arrays.
When the element is not specified, it defaults to element 0.
All examples in section
\begin_inset LatexCommand \ref{sub:stdvars}
\end_inset
use element 0 of an array via this default behavior.
To specify a specific element, follow the name of the variable by the element
number enclosed in brackets (
\family typewriter
[
\family default
and
\family typewriter
]
\family default
).
Example:
\layout LyX-Code
foo[2] = "Hello!"
\layout Standard
It's possible--and useful--to assign to several elements of an array at
the same time.
To do this, simply include more than one argument after the equals sign.
All elements starting at the specified number will be assigned with their
respective argument.
Example:
\layout LyX-Code
foo[0] = "one" "two"
\layout Standard
This will assign
\begin_inset Quotes eld
\end_inset
one
\begin_inset Quotes erd
\end_inset
to the element 0 of
\family typewriter
foo
\family default
and
\begin_inset Quotes eld
\end_inset
two
\begin_inset Quotes erd
\end_inset
to element 1.
If you specify no arguments after the equals sign, all elements beginning
at the specified number are simply removed.
If this is element 0, the variable becomes a zero-size array, which is
important in embedding and expansion.
\layout Subsubsection
Embedding Arrays
\layout Standard
As with assignment, you need only specify the element number in brackets
after the name of a variable to use that specific element.
Example:
\layout LyX-Code
echo $foo[2]
\layout Standard
If you wish to enclose the name of the variable in curly braces, the brackets
and element number must fall inside the braces:
\layout LyX-Code
echo ${foo[2]}
\layout Standard
Instead of a dollar sign, you may use a number symbol (
\family typewriter
#
\family default
).
In this case, the size of the array will be embedded in the argument rather
than its value.
Variables that have never been used are considered to have a size of zero.
If you specify an element, the size of the array minus the specified number
will be used.
Example:
\layout LyX-Code
foo = "one" "two" "three"
\layout LyX-Code
echo #foo // Prints: 3
\layout LyX-Code
echo #foo[1] // Prints: 2
\layout Subsubsection
Expanding Arrays
\layout Standard
A very useful feature of arrays is the ability to expand them into multiple
arguments.
If a normal argument begins with an at symbol (
\family typewriter
@
\family default
), the rest of the argument will be treated as the name of an array.
The argument will be removed and replaced by a single argument for each
element of the array.
Consider the following program:
\layout LyX-Code
array = one two three
\layout LyX-Code
echo @array
\layout Standard
This prints the exact same thing as:
\layout LyX-Code
echo one two three
\layout Standard
It's possible to specify a range of elements to use instead of the entire
array.
To do this, follow the name of the array with an opening bracket, the number
of the first element to use, a colon (:), one plus the number of the last
element to use, and a closing bracket.
Example:
\layout LyX-Code
array = one two three four
\layout LyX-Code
echo @array[1:3] // Prints: two three
\layout LyX-Code
\layout Standard
\line_top \line_bottom
\series bold
Note
\series default
:
\emph on
To understand why you add one to the second number, envision each element
of the array as a different pile of groceries on a store checkout belt.
Between each pile sits a plastic separator.
The numbers in the brackets represent the numbers of the separators.
To specify the second and third piles of groceries, you would pick all
the piles between the first separator and the third separator.
If bad analogies don't suit you, simply remember to specify one more than
the last element that you want.
\layout Standard
Negative numbers count backward from the end of the array.
For instance, using -1 for the second number will include everything except
the very last element of the array.
To specify the very end of the array, omit the second number.
Examples:
\layout LyX-Code
array = one two three four
\layout LyX-Code
echo @array[1:-1] // Prints: two three
\layout LyX-Code
echo @array[2:] // Prints: three four
\layout LyX-Code
echo @array[-1:] // Prints: four
\layout Standard
If the selected range does not make sense (i.e.
the starting element comes after the ending element), or begins past the
end of the array, no arguments will be added.
If the range begins within the array but extends beyond its size, it will
be clipped to the end of the array.
\layout Subsection
Hashes
\layout Standard
Every element in a GIB array is capable of containing a hash.
A hash is an unordered list of names, called
\emph on
keys
\emph default
, that can be used to access more arrays.
Another way to think about it is that each element of an array can have
its own set of variables.
\layout Subsubsection
Assigning to Hashes
\layout Standard
Assignment to a hash is very similar to normal assignment, except that you
must specify an additional name (called the key) and optional element number.
The element that contains the hash is called the
\emph on
stem
\emph default
, and the array stored in the hash is called the
\emph on
leaf
\emph default
.
The stem and leaf are separated by a single period.
Examples:
\layout LyX-Code
foo.bar = "Hello"
\layout LyX-Code
foo[2].bar = "World"
\layout LyX-Code
foo[3].bar[2] = "!!"
\layout LyX-Code
foo.bar.baz = "There is no limit to the depth of hashes"
\layout Standard
As the last example shows, the elements of the arrays stored in a hash can
have their
\emph on
own
\emph default
hashes.
The depth of GIB variables is limited only by system memory.
\layout Subsubsection
Embedding Hashes
\layout Standard
As with assignment, embedding hashes uses the same format as embedding standard
variables.
However, you
\emph on
must
\emph default
use curly braces or the periods between stems and leaves will not be treated
as part of the variable.
Examples:
\layout LyX-Code
echo ${foo.bar}
\layout LyX-Code
echo ${foo[2].bar}
\layout LyX-Code
echo ${foo[3].bar[2]}
\layout LyX-Code
echo ${foo.bar.baz}
\layout Subsubsection
Expanding Hashes
\layout Standard
If an array element contains a hash, it's possible to acquire a list of
all the keys it contains.
If a normal argument begins with a percent symbol (
\family typewriter
%
\family default
), the rest of the argument will be treated as the name of a variable and
optional element number.
The argument will be removed, and one argument will be added in its place
for each key in the hash.
Example:
\layout LyX-Code
foo.one = "a"
\layout LyX-Code
foo.two = "b"
\layout LyX-Code
foo.three = "c"
\layout LyX-Code
echo %foo // Prints in any order: one two three
\layout Standard
If the hash is unused or contains no keys, no arguments will be added.
Note that the order of keys in the resulting list is unpredictable.
\layout Subsection
Dynamic Variables
\layout Standard
Many of the features of variables would be absolutely useless without the
ability to assign, embed, or expand variables differently depending on
circumstances when the program is run.
For instance, arrays would not be very flexible if you couldn't calculate
the element number you wish to access while the program is running.
Luckily, GIB allows you to use values of other variables to construct the
name a variable before accessing it.
\layout Subsubsection
Assigning Dynamically
\layout Standard
To assign dynamically, simply embed other variables as you would in any
other argument.
For instance, you could assign to an element of an array as follows:
\layout LyX-Code
number = 2
\layout LyX-Code
foo[$number] = "bar"
\layout Standard
Variable leaves can be assigned to in the same way:
\layout LyX-Code
leaf = "bar"
\layout LyX-Code
foo.$leaf.message = "This variable was assigned to dynamically."
\layout Standard
Deciding element numbers or leaves while the script is running is the chief
use of this ability, but you can dynamically construct a variable name
any way you wish:
\layout LyX-Code
array = "in" "mouse" "amp"
\layout LyX-Code
echo Setting sensitivity to 10...
\layout LyX-Code
set ${array[0]}_${array[1]}_${array[2]} 10
\layout Standard
This may prove useful under certain circumstances, even though the example
given isn't one of them.
\layout Subsubsection
Embedding Dynamically
\layout Standard
Embedding dynamically follows a similar pattern.
Within the name of an embedded variable you may embed other variables.
Example:
\layout LyX-Code
number = 3
\layout LyX-Code
foo[$number] = "bar"
\layout LyX-Code
echo Element $number of foo is equal to $foo[$number]
\layout Standard
This works for leaves as well:
\layout LyX-Code
leaf = "bar"
\layout LyX-Code
foo.$leaf = "Hello"
\layout LyX-Code
echo ${foo.$leaf} // Prints: Hello
\layout Standard
Remember that in most circumstances, you must surround the entire variable
name with braces.
The only case where you don't have to is when embedding a variable as an
element number, as in the first example.
\layout Subsubsection
Expanding Dynamically
\layout Standard
Dynamic expansion is as simple as dynamic assignment.
You can embed variables in an argument beginning with @ or % as you would
with any other argument.
Example:
\layout LyX-Code
array = one two three four
\layout LyX-Code
start = 1
\layout LyX-Code
end = 3
\layout LyX-Code
echo @array[$start:$end] // Prints: two three
\layout Subsection
Variable Scope
\layout Comment
FIXME: add this section!
\layout Subsubsection
Locals
\layout Subsubsection
Globals
\layout Subsubsection
Domains
\layout Section
\pagebreak_top
Flow Control
\layout Standard
Flow control refers to controlling the order in which commands are executed
-- or if they are executed at all -- in your GIB script.
GIB currently offers two ways to control program flow:
\layout Description
Conditionals execute a command or group of commands if a certain condition
is met
\layout Description
Loops execute a command or group of commands multiple times while a certain
condition is met.
\layout Subsection
Conditionals
\layout Subsubsection
\family typewriter
if
\family default
and
\family typewriter
ifnot
\layout Standard
The
\family typewriter
if
\family default
structure will execute a group of commands when a condition is
\begin_inset Quotes eld
\end_inset
true.
\begin_inset Quotes erd
\end_inset
An optional
\family typewriter
else
\family default
structure may follow, which contains a group of commands to be executed
if the condition is
\begin_inset Quotes eld
\end_inset
false
\begin_inset Quotes erd
\end_inset
.
When
\family typewriter
ifnot
\family default
is used, the condition is reversed.
The syntax for
\family typewriter
if
\family default
and
\family typewriter
ifnot
\family default
is as follows:
\layout LyX-Code
\family sans
if
\family default
condition block1 [
\family sans
else
\family default
block2]
\layout Standard
Explanations of what each part means follow:
\layout Description
condition may be any type of argument that is not a program block.
Its value will be treated as a number; 0 will be deemed
\begin_inset Quotes eld
\end_inset
false
\begin_inset Quotes erd
\end_inset
and all other numbers will be deemed
\begin_inset Quotes eld
\end_inset
true.
\begin_inset Quotes erd
\end_inset
If the value does not appear to be a number, it will be considered false.
When
\family typewriter
ifnot
\family default
is used instead of
\family typewriter
if
\family default
, true and false are reversed.
\layout Description
block1 must be a program block argument.
If
\family typewriter
condition
\family default
was considered to be true, the commands in the block will be executed.
\layout Description
else may optionally follow
\family typewriter
block1
\family default
, in which case
\family typewriter
block2
\family default
must also be provided.
\layout Description
block2 can be either a command or a single program block.
If
\family typewriter
condition
\family default
was false and
\family typewriter
block2
\family default
was provided, it will be executed instead of
\family typewriter
block1
\family default
.
\layout Standard
The simplest form of
\family typewriter
if
\family default
is shown in Figure
\begin_inset LatexCommand \vref{cap:if-simple}
\end_inset
.
Because the number 1 is non-zero and thus considered true, the program
block will be executed and text will be printed.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{if-simple.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{if-simple.gib.out}
preview false
\end_inset
\layout Caption
Simple
\family typewriter
if
\family default
structure
\begin_inset LatexCommand \label{cap:if-simple}
\end_inset
\end_inset
\layout Standard
Figure
\begin_inset LatexCommand \vref{cap:if-else}
\end_inset
is similar to Figure
\begin_inset LatexCommand \ref{cap:if-simple}
\end_inset
, but includes an
\family typewriter
else
\family default
structure.
The condition argument is false, and thus the second program block is executed.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{if-else.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{if-else.gib.out}
preview false
\end_inset
\layout Caption
\family typewriter
if/else
\family default
structure
\begin_inset LatexCommand \label{cap:if-else}
\end_inset
\end_inset
\layout Standard
Besides a program block, a simple command may follow
\family typewriter
else
\family default
, including another
\family typewriter
if
\family default
structure.
This allows
\family typewriter
if
\family default
structures to be chained together.
The first structure that is true will be the one executed, as shown by
Figure
\begin_inset LatexCommand \ref{cap:if-chain}
\end_inset
.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{if-chain.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{if-chain.gib.out}
preview false
\end_inset
\layout Caption
Chained
\family typewriter
if
\family default
structures
\begin_inset LatexCommand \label{cap:if-chain}
\end_inset
\end_inset
\layout Standard
Remember that
\family typewriter
ifnot
\family default
may always be used in place of
\family typewriter
if
\family default
to reverse
\family typewriter
condition
\family default
.
\layout Subsection
Loops
\layout Subsubsection
\family typewriter
while
\layout Standard
The
\family typewriter
while
\family default
structure is very similar to a basic
\family typewriter
if
\family default
structure, except that the program block is continuously executed as long
as the condition argument is
\begin_inset Quotes eld
\end_inset
true.
\begin_inset Quotes erd
\end_inset
The formal syntax is:
\layout LyX-Code
\family sans
while
\family default
condition block
\layout Description
condition is the same as
\family typewriter
condition
\family default
in an
\family typewriter
if
\family default
structure; all non-zero numbers are
\begin_inset Quotes eld
\end_inset
true,
\begin_inset Quotes erd
\end_inset
anything else is false.
If condition is true, block will be executed.
\layout Description
block must be a program block argument.
If
\family typewriter
condition
\family default
is true, it will be executed.
After it has been executed,
\family typewriter
condition
\family default
will be checked again.
As long as
\family typewriter
condition
\family default
is true,
\family typewriter
block
\family default
will be continually executed.
\layout Standard
Figure
\begin_inset LatexCommand \vref{cap:while}
\end_inset
shows an example
\family typewriter
while
\family default
loop and its output.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{while.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{while.gib.out}
preview false
\end_inset
\layout Caption
Example
\family typewriter
while
\family default
loop.
\begin_inset LatexCommand \label{cap:while}
\end_inset
\end_inset
\layout Subsubsection
\family typewriter
for
\layout Standard
The for loop executes a program block once for every argument in a list.
Each execution, a variable will be set to the value of the current argument.
Syntax:
\layout LyX-Code
\family sans
for
\family default
variable
\family sans
in
\family default
list block
\layout Description
variable is the variable that will be set to the value of the current argument
each time the program block is executed.
\layout Description
in is a simple placeholder between
\family typewriter
variable
\family default
and
\family typewriter
list
\family default
.
It emphasizes the fact that
\emph on
for
\emph default
each argument
\emph on
in
\emph default
the list, the program block will be executed.
\layout Description
list can be any number of arguments, including expansions.
\layout Description
block must be the last argument to
\family typewriter
for
\family default
, and it must be a program block.
\layout Standard
Figure
\begin_inset LatexCommand \vref{cap:for}
\end_inset
shows an example
\family typewriter
for
\family default
loop and its output.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{for.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{for.gib.out}
preview false
\end_inset
\layout Caption
Example
\family typewriter
for
\family default
loop
\begin_inset LatexCommand \label{cap:for}
\end_inset
\end_inset
\layout Subsubsection
Additional Loop Functions:
\family typewriter
break
\family default
and
\family typewriter
continue
\layout Standard
Two functions are available to control the behavior of loops during execution
of their program blocks:
\layout Description
break immediately ends the program block and leaves the loop.
\layout Description
continue returns to the top of the loop.
This means that
\family typewriter
while
\family default
loops check their condition argument again and
\family typewriter
for
\family default
loops move to the next argument in the list.
\layout Standard
Figure
\begin_inset LatexCommand \vref{cap:break}
\end_inset
shows an example use of
\family typewriter
break
\family default
and its output, while Figure
\begin_inset LatexCommand \ref{cap:continue}
\end_inset
shows an example use of
\family typewriter
continue
\family default
.
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{break.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{break.gib.out}
preview false
\end_inset
\layout Caption
Example use of
\family typewriter
break
\begin_inset LatexCommand \label{cap:break}
\end_inset
\end_inset
\layout Standard
\begin_inset Float figure
wide false
collapsed false
\layout LyX-Code
\line_top \line_bottom
\begin_inset Include \verbatiminput{continue.gib}
preview false
\end_inset
\layout Standard
\series bold
Output:
\layout LyX-Code
\begin_inset Include \verbatiminput{continue.gib.out}
preview false
\end_inset
\layout Caption
Example use of
\family typewriter
continue
\begin_inset LatexCommand \label{cap:continue}
\end_inset
\end_inset
\layout Section
\pagebreak_top
Functions
\layout Subsection
Types and Concepts
\layout Subsection
Defining Functions
\layout Subsection
Accessing Arguments
\layout Subsection
Return Values
\layout Subsubsection
Returning Values from Functions
\layout Subsubsection
Embedding Return Values
\layout Subsubsection
Expanding Return Values
\the_end