MOO provides three different kinds of looping statements, allowing you to have a set of statements executed (1) once for each element of a given list, (2) once for each integer or object number in a given range, and (3) over and over until a given condition stops being true.
To perform some statements once for each element of a given list, use this syntax:
for variable in (expression) statements endfor
The expression is evaluated and should return a list; if it does not,
E_TYPE
is raised. The statements are then executed once for
each element of that list in turn; each time, the given variable is
assigned the value of the element in question. For example, consider
the following statements:
odds = {1, 3, 5, 7, 9}; evens = {}; for n in (odds) evens = {@evens, n + 1}; endfor
The value of the variable `evens' after executing these statements is the list
{2, 4, 6, 8, 10}
To perform a set of statements once for each integer or object number in a given range, use this syntax:
for variable in [expression-1..expression-2] statements endfor
The two expressions are evaluated in turn and should either both return integers
or both return object numbers; E_TYPE
is raised otherwise. The
statements are then executed once for each integer (or object number, as
appropriate) greater than or equal to the value of expression-1 and less
than or equal to the result of expression-2, in increasing order. Each
time, the given variable is assigned the integer or object number in question.
For example, consider the following statements:
evens = {}; for n in [1..5] evens = {@evens, 2 * n}; endfor
The value of the variable `evens' after executing these statements is just as in the previous example: the list
{2, 4, 6, 8, 10}
The following loop over object numbers prints out the number and name of every valid object in the database:
for o in [#0..max_object()] if (valid(o)) notify(player, tostr(o, ": ", o.name)); endif endfor
The final kind of loop in MOO executes a set of statements repeatedly as long as a given condition remains true:
while (expression) statements endwhile
The expression is evaluated and, if it returns a true value, the statements are executed; then, execution of the `while' statement begins all over again with the evaluation of the expression. That is, execution alternates between evaluating the expression and executing the statements until the expression returns a false value. The following example code has precisely the same effect as the loop just shown above:
evens = {}; n = 1; while (n <= 5) evens = {@evens, 2 * n}; n = n + 1; endwhile
Fine point: It is also possible to give a `name' to a `while' loop, using this syntax:
while name (expression) statements endwhilewhich has precisely the same effect as
while (name = expression) statements endwhileThis naming facility is only really useful in conjunction with the `break' and `continue' statements, described in the next section.
With each kind of loop, it is possible that the statements in the body of the loop will never be executed at all. For iteration over lists, this happens when the list returned by the expression is empty. For iteration on integers, it happens when expression-1 returns a larger integer than expression-2. Finally, for the `while' loop, it happens if the expression returns a false value the very first time it is evaluated.