Repetition (or “Loops”)
Pike has four different facilities for repetition:
the while statement,
the for statement,
the do while statement,
and the foreach statement.
The while Statement
The while statement does something
as long as a condition is true.
It follows this template:
while ( *expression* )
*statement*
Pike calculates the value of expression. If the value is false, it leaves the loop. If the value is true, it executes statement, and then it goes back to the start and calculates the value of expression once again, to see if we should run another iteration of the loop.
Example:
while (temperature < 200)
heat_some_more();
This will keep calling the method heat_some_more
until the value of temperature is at least 200.
If temperature was at least 200 from the start,
heat_some_more is never called.
As always,
statement can be a block,
so we can have several statements that are executed
in each iteration of the loop.
This example will print the first five elements
(element number 0, 1, 2, 3, and 4)
in the array argv,
each on its own line:
int i = 0;
while (i < 5)
{
write(argv[i] + "\n");
i = i + 1;
}
The for Statement
The for statement does something as long as a condition is true,
just like the while statement,
but the for statement also has a place
to put an expression that is calculated
before the loop is started,
and another place
for an expression that is run immediately after the statement in the loop.
The for loop follows this template:
for ( *init-expression* ; *condition-expression* ; *change-expression* )
*statement*
This is (almost exactly) equivalent to this while loop:
*init-expression*;
while ( *condition-expression* )
{
*statement*
*change-expression*;
}
The while loop in the example above, the one that writes the element in an array, can be re-written as a for loop, like this:
int i;
for (i = 0; i < 5; i = i + 1)
write(argv[i] + "\n");
As an extra feature,
the definition of the loop variable
can be put inside the for loop:
for (int i = 0; i < 5; i = i + 1)
write(argv[i] + "\n");
In that case,
the variable i is local in the for loop,
and disappears when we leave the loop.
The do while Statement
Sometimes we don’t want to do the test in a loop until after the first iteration of the statement in the loop. In those case we can use a do while loop. The do while loop statement follows this template:
do
*statement*
while ( *expression* );
Pike starts by executing statement. Then it calculates the value of expression. If the value is false, it leaves the loop. If the value is true, it goes to the start of the loop, executes statement again, and then calculates the value of expression once again, to see if we should run another iteration of the loop.
If we want the user to answer “yes” or “no” to a question, and we want to keep asking until we get either “yes” or “no”, we could write a loop like this:
string answer;
write("Do you like Pike programming?\n");
do
{
write("Answer yes or no: ");
answer = Stdio.stdin->gets();
} while (answer != "yes" && answer != "no");
The foreach Statement
The foreach loop statement is very useful. It goes through all the elements in an array, doing something with each element. It follows this template:
foreach( *container* , *loop-variable* )
*statement*
Container should be an expression with an array as value, and loop-variable should be the name of a variable. Pike will execute statement once for each element in the array container, with that element in the variable loop-variable. This example will print all the strings in the array argv, each on its own line:
string s;
foreach (argv, s)
write(s + "\n");
The foreach statement is similar to the for statement,
in that the definition of the loop variable
can be put inside the foreach loop:
foreach(argv, string s)
write(s + "\n");
In that case,
the variable s is local in the foreach loop,
and disappears when we leave the loop.
break and continue
Sometimes you want to leave a loop somewhere in the middle,
and continue executing the program
after the end of the loop.
You can use the break statement for this,
as in this example:
while (1)
{
string command = Stdio.stdin->gets();
if (command == "quit")
break;
do_command(command);
}
break can be used in loops and in switch statements.
It will cause Pike to “break out” of the loop or switch statements,
and execution will continue after the loop or switch statement.
continue,
on the other hand,
can only be used in loops.
A continue statement will cause Pike
to skip the rest of the body of the loop,
going directly to the next iteration.
For example,
this loop will never call do_command
with an empty string as argument:
while (1)
{
string command = Stdio.stdin->gets();
if (strlen(command) == 0)
continue;
do_command(command);
}
Some programmers feel that continue is unnecessary
and makes the code hard to read.
A loop that uses continue
can always be re-written without continue.
Our example would look like this:
while (1)
{
string command = Stdio.stdin->gets();
if (strlen(command) != 0)
do_command(command);
}
There are at least three more ways of leaving a loop in the middle:
You can use the
returnstatement to leave the entire method.You can use
throwto throw an exception.You can call
exitto terminate the program.