For the last year, I have regularly worked on a legacy project written in xBase / Clipper, which is a dialect of the dBase programming language. The language as a whole is surprisingly comfortable for its age, being 40 years old now. But there were a few quite infuriating things I stumbled upon:
Trailing commas in arrays
The language allows you to define array contents inline like this:
myArray := { 1, "foo", .t., 4.0 }
It is also dynamically typed, as you can see in this example – where the array holds numbers, strings and boolean (logical) values. Now sometimes, you want to spread-out an array initialization over multiple lines. xBase lets you do that – using the semi-colon quite contrary to many other languages – to continue a line:
myArray := {; "foo",; "bar"; }
Now you might be temped, as I was, to write it like this instead:
myArray := {; "foo",; "bar",; }
With a trailing comma. But, gotcha, that does not do what you probably expect. This actually creates an array with 3 elements, where the last element is nil
.
Unequal is not not-equals
xBase has both the ==
and the !=
operators. But imagine my suprise when and if a != b
was not entered, with what had to be unequal strings. I added some logging (yea, no debugger) and saw that I indeed had the strings ""
and "foo"
. Still, a != b
seemed to evaluate to false
. Because I could not believe that, I changed it to !(a == b)
– and it worked!
It turns out that the !=
operator is not the opposite of the ==
operator, but rather of the =
operator (xBase uses :=
for assignment). The =
operator, however, implements some kind of “fuzzy” equals by default, also evaluating true if the left operand is a prefix of the right operand. This is a behaviour that can be changed globally by “SET EXACT on”. Wow.