[net.lang.mod2] One pass compilation/forward references

powell@decwrl.UUCP (Mike Powell) (09/06/84)

Gore's comments on forward references overlook an important point.  Although
Pascal requires all variable declarations in a block to precede any nested
procedure definitions, Modula-2 does not.  Therefore, a statement can refer
to a variable (constant, type, or procedure, as well) that is defined in an
enclosing procedure after the point of reference.  E.g.,

    module ForwardLooking;

    procedure Reference;
    begin
	v := c;	(* this is OK in real Modula-2 *)
    end Reference;

    var
	v : cardinal;
    const
	c = 10;
    begin
	v := c;	(* of course, this is OK *)
    end ForwardLooking.

It is true that the compiler could go back and fix up the references when it
encounters the definitions (We used to call this making 1 + epsilon passes).
However, doing so can be awkward in general, since the compiler knows so little
about v and c when it first sees the reference.  Although by context, v must be
a variable, c could be a constant or a variable (Thanks to the parentheses
required on functions, it cannot be a function call, although c might be the
name of a procedure if v were a procedure variable).

To see that forward referencing can be useful, consider the use of internal
modules in the following example.

    module Dilemma;

    module chicken;			module egg;
    import numEggs;			import numChickens;
    export numChickens;			export numEggs;
    var numChickens : cardinal;		var numEggs : cardinal;
    procedure Lay();			procedure Hatch();
    begin				begin
	inc(numEggs);			    dec(numEggs);
    end Lay;				    inc(numChickens);
    end chicken;			end Hatch;
					end egg;
    end Dilemma.

Although we might want Modula-2 to accept them as they are written above, in
real life, one or the other must appear first.  Although I am not a big fan of
internal modules, I have seen non-trivial examples of them for which it would
be difficult to sort the definitions.  (I sometimes wonder why Wirth didn't
allow forward references in declarations, as well;  then I recall that it would
require yet another pass.)
					Michael L. Powell
					Digital Equipment Corporation
					Western Research Laboratory
					Los Altos, CA  94022
					{decvax,ucbvax}!decwrl!powell
					powell@decwrl