# Conditional constructs

When you want a program to do one of several possible things in different situations, use a conditional construct. OmniMark provides a conditional operator as well as three different forms of conditional construct based upon the basic dodone block.

It is important to note that almost anything in OmniMark can be made conditional simply by adding a when keyword followed by a test. For example, any rule can have conditions added to it:

find "cat" when i = 4
output "I found a cat%n"

This rule would only output I found a cat if cat is found in the input data and the value of i is equal to 4.

You can select between two possible values using the conditional operator:

process
local integer planet initial { 3 }

output "Hello "
|| (planet = 3 -> "Human" | "Alien")

The most general of the conditional constructs is the do when block. This allows you to have an OmniMark program perform various actions based on the results of one or more tests. For example,

do when i = 4
output "Yes, the value of i is four%n"
done

If you want the program to do one thing when a certain condition is true and another if it is false, you can add an else option.

do when words matches uc
output "lg" % words || "%n"

else
output words || "%n"
done

More complex conditions can be specified in a do when block by using the | (or) and & (and) operators to build up larger boolean conditions. For example:

do when i = 1 | i = 5
output "Yes, the value of i is one or five%n"

else
output "Oh well, the value of i is not one or five%n"
done

do when blocks can be much more complex than this, however, since else when clauses are also allowed.

do when i = 4
output "Yes, the value of i is four%n"

else when i = 5
output "The value of i is five%n"

else when i = 6
output "The value of i is six%n"

else
output "The value of i is not 4, 5, or 6%n"
done

Another form of conditional construct is the do select construct:

do select i
case 1 to 5
output "The value of i is within the first range%n"

case 6 to 10
output "The value of i is within the second range%n"
done

The program won't do anything if the value of i is less than 1 or greater than 10, however, because there is no alternative that will be executed in these situations. This is quite easily rectified, by adding an else clause to the construct:

do select i
case 1 to 5
output "The value of i is within the first range%n"

case 6 to 10
output "The value of i is within the second range%n"

else
output "The value of i is out of range%n"
done

While else clauses can be used within a do select construct, else when clauses cannot.

If you want the program to do something when a expression is equal to a particular value, you have to specify that within another case clause. For example:

do select i
case 1 to 4
output "The value of i is in the first range%n"

case 5
output "The value of i is equal to 5%n"

case 6 to 10
output "The value of i is in the second range%n"

else
output "The value of i is out of range%n"
done

Conditionals constructs can also be based on the run-time type of a extended record; see do select-type for details.

The final form of conditional constructs is a do scan. do scan constructs are used to examine a piece of input data for certain patterns. If one of the patterns is discovered in the input data, a set of specified actions is performed. For example, the following program retrieves the name of the current day and scans it. Depending on which pattern is found, the program will output one of several possible phrases.

process
do scan date "=W"
match "Monday"
output "I don't like Mondays.%n"

match "Friday"
output "I love Fridays!!!%n"

else
output "At least it's not Monday.%n"
done

do scan constructs can be used to scan input data in the form of files, strings, or string sources.