Correct For Loop Design
Posted
by
Yttrill
on Programmers
See other posts from Programmers
or by Yttrill
Published on 2011-12-12T13:38:34Z
Indexed on
2012/03/27
11:38 UTC
Read the original article
Hit count: 455
What is the correct design for a for
loop?
Felix currently uses
if len a > 0 do
for var i in 0 upto len a - 1 do
println a.[i];
done
done
which is inclusive of the upper bound. This is necessary to support the full range of values of a typical integer type. However the for loop shown does not support zero length arrays, hence the special test, nor will the subtraction of 1 work convincingly if the length of the array is equal to the number of integers. (I say convincingly because it may be that 0 - 1 = maxval: this is true in C for unsigned int, but are you sure it is true for unsigned char without thinking carefully about integral promotions?)
The actual implementation of the for loop by my compiler does correctly handle 0 but this requires two tests to implement the loop:
continue:
if not (i <= bound) goto break
body
if i == bound goto break
++i
goto continue
break:
Throw in the hand coded zero check in the array example and three tests are needed.
If the loop were exclusive it would handle zero properly, avoiding the special test, but there'd be no way to express the upper bound of an array with maximum size.
Note the C way of doing this:
for(i=0; predicate(i); increment(i))
has the same problem. The predicate is tested after the increment, but the terminating increment is not universally valid!
There is a general argument that a simple exclusive loop is enough: promote the index to a large type to prevent overflow, and assume no one will ever loop to the maximum value of this type.. but I'm not entirely convinced: if you promoted to C's size_t and looped from the second largest value to the largest you'd get an infinite loop!
© Programmers or respective owner