This page has been validated.
Guy L. Steele Jr.
19
Debunking the "Expensive ..." Myth


((LABEL LOOP
        (LAMBDA (M A)
                (IF (= M 0)
                    A
                    (LOOP (- M 1) (* M A)))))
 N 1)

Compare this with the Algol version:


begin
   A := 1;
   for M := N step -1 until 0 do
      A := A * M;
end

As it happens, in the Algol version we could absorb the stepping of one of the variables into a for construction. However, the nature of the loop is that two variables are stepped, and the Algol version makes one of them very hard to see! The stepping must be expressed through a side-effect (assignment) to a variable global to the loop. The LISP version has identical semantics but proceeds without explicit side-effect, and expresses the stepping of the two variables in the same manner. (Cf. the PLASMA version given in [Hew77].)

Procedure calls also allow one to express escapes and non-standard loops. Consider the table-search example from [Knu74], expressed here in terms of procedure calls:


procedure search(a,b,n,key);
   begin
       procedure search loop(i);
           if i>n then
               begin
                   n:=n+1;
                   a[n]:=key;
                   b[n]:=1
               end
           else i: a[i]=key then
               b[i]:=b[i]+1
           else search loop(i+1);
       search loop(1)
   end

The structure of the algorithm to be performed is a loop with two possible exit points. This is easily expressed by procedure calls, because we can specify for each branch of the if-then-else whether or not to take another cycle of the loop. (In fact, we can argue for this style on the basis of an important primitive principle: any notation should accentuate the unusual and make unobtrusive the usual. Now for a loop there are two cases when the body is done: take another cycle, or exit the loop. Now exiting the loop is the unusual case at run time, because we expect to iterate many times for each time a loop is exited; this leads us to design loop syntaxes which accentuate exit conditions. We may ponder, however, the fact that textually there will be one or more iteration points and one or more exit points. In the case of while-do, there is one of each. If we want to have while-do with multiple exits, then we should accentuate the looping action, and de-emphasize the exiting action. This occurs in the version of "search loop" given above.)

An additional advantage of the procedural mode of expression is that