# Control Flow¶

Loci has two constructs for flow control:

• While loop
• For-each loop

## While Loop¶

This is a very standard construct that exists in many other languages. For example:

void example() {
int i = 0;
while (i < 5) {
printf(C"i = %d\n", i);
i += 1;
}
}


This will of course print:

i = 0
i = 1
i = 2
i = 3
i = 4


## For-each Loop¶

A for-each loop is used to iterate over ranges. Again, this is very similar to constructs offered by many languages. In this case, the syntax and semantics are essentially identical to C++11’s for-each loop.

Here’s an example:

void example(std::varray<int> array) {
for (int element: array.all()) {
printf(C"element = %d\n", element);
}
}


This is equivalent to:

void example(std::varray<int> array) {
const auto& range = array.all();
while (!range.empty()) {
int element = range.front();
printf(C"element = %d\n", element);
range.skip_front();
}
}


## C/C++ For Loop¶

Note that Loci doesn’t support a for loop as has existed in C and C++ for a long time. The primary reason is that such a construct can be easily replicated by either a while loop and for-each loop; usually the latter is most suitable.

For example, consider this C++ example:

void example() {
for (int i = 0; i < 5; i++) {
printf(C"i = %d\n", i);
}
}


In Loci the equivalent idiomatic code would be:

void example() {
for (int i: range<int>(0, 5)) {
printf(C"i = %d\n", i);
}
}


These examples are very similar, though the latter is arguably better since it doesn’t modify the variable i. For example, you could make i const:

void example() {
for (const int i: range<int>(0, 5)) {
printf(C"i = %d\n", i);
}
}


range() is an example of a Value Generator.

## Break/Continue¶

Just like C and C++, Loci provides break and continue and these behave in exactly the same way.

Here’s an example:

void example() {
for (const int i: range<int>(0, 5)) {
if (i == 1) {
continue;
} else if (i == 4) {
break;
}
printf(C"i = %d\n", i);
}
}