Paying around with Pascal recently, I had forgot about how nice its *sets* structures are. In addition to arrays and records, sets offer an alternative built-in data structure. For those that don’t know, a *set* is a collection of items of the same type – it is essentially a *packaged, unindexed* data structure. They are inherent flexible, and useful, largely because of the syntax. Operations are provided for set union, intersection, membership, and construction. For example:

**var** digit : **set of** '0'..'9'
range : **set of** 1..100;
alphabet : **set of** 'a'..'z';

defines a set, digit, that may contain any combination of the characters ‘0’ through ‘9’. The predicate:

x **in** digit

tests whether or not the value of the variable **x** is in the set **digit. **Here’s a good example of how sets can be used::

operandset, operatorset: **set of** char;
operatorset := ['%','+','-','*','/','^'];
operandset := ['a'..'z','0'..'9'];

This leads to very efficient statements, of the form:

**if** x **in** operandset
**then** write(' operand** ')
else if** x **in** (operatorset + ['(',')'])
**then** write(' operator or parenthesis ')
**else** write(' illegal symbol ')

Here’s the equivalent in Fortran, which has no similar structure:

**if** ((x >= 'a' .and. x <= 'z') .or. &
(x >= '0' .and. x <= '9')) **then**
write(*,*) **"**operand**"
elseif** (x == '%' .or. x == '+' .or. x == '-' .or. &
x == '*' .or. x == '/' .or. x == '^' .or. &
x == '(' .or. x == ')') **then**
write(*,*) "operator or parenthesis**"
else**
write(*,*) "illegal symbol**"
end if**

Now although many languages such as C++ provide support for sets in some form or another, rarely is it part of the core language. So languages such as Fortran, or C contain no real set structure. Why do I care about this? Because there are certain circumstances when a set can help reduce syntactic complexity, as the example above shows.