#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 \begin_inset Text \layout Standard Character \end_inset \begin_inset Text \layout Standard Replacement \end_inset \begin_inset Text \layout Standard \family typewriter n \end_inset \begin_inset Text \layout Standard Newline \end_inset \begin_inset Text \layout Standard \family typewriter t \end_inset \begin_inset Text \layout Standard Tab \end_inset \begin_inset Text \layout Standard \family typewriter r \end_inset \begin_inset Text \layout Standard Carriage return \end_inset \begin_inset Text \layout Standard \family typewriter " \end_inset \begin_inset Text \layout Standard Double quote (does not end argument) \end_inset \begin_inset Text \layout Standard \family typewriter \backslash \end_inset \begin_inset Text \layout Standard Backslash (does not escape next character) \end_inset \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