[comp.lang.ada] Side effect

lius@beach.cis.ufl.edu (Scott Liu) (04/09/88)

Recently, I wrote an Ada program with side effect on a function, 
called NEXT, which is used on both type and variable declarations.
I got very weird program output when I ran it using TeleSoft Ada 
compiler.  Is this a compilation error or compiler-dependent feature?

Thanks for your comments.

Sying-Syang Liu
Dept. of Computer and Information Sciences
University of Florida
UUCP: {ihnp4,rutgers}!codas!ufcsv!lius
Internet mail: lius@ufl.edu


------ Program source -------------

with TEXT_IO; use TEXT_IO;
procedure SET2 is
  ID:INTEGER:=0;

  function NEXT return INTEGER is
  begin
    ID:=ID+1;
    return ID;
  end;

begin
  declare
    type BIG is record X:INTEGER:=NEXT; end record;  -- ???
    A:array (1..5) of BIG;                           -- ???
    B:integer:=NEXT;
  begin
    for I in A'RANGE loop
      PUT(INTEGER'IMAGE(A(I).X));
    end loop;
    PUT_LINE(INTEGER'IMAGE(B));
  end;
end;

----- Program output -----

 1 2 3 4 5 6

--------------------------
Note: I expected to have the output 
	1 1 1 1 1 2

ok@quintus.UUCP (Richard A. O'Keefe) (04/09/88)

In article <14425@uflorida.cis.ufl.EDU>, lius@beach.cis.ufl.edu (Scott Liu) writes:
>   ID: INTEGER := 0;
>   function NEXT return INTEGER is
>   begin
>     ID := ID+1;
>     return ID;
>   end;
> declare
>   type BIG is record X: INTEGER := NEXT; end record;  -- ???
>   A: array (1..5) of BIG;                             -- ???

{A is (1,2,3,4,5), not the expected (1,1,1,1,1).}

This is the way ADA is generally supposed to work.  For example,
	X, Y: INTEGER := NEXT;
is defined to be equivalent to
	X: INTEGER := NEXT;
	Y: INTEGER := NEXT;
In general, what matters is not how many copies of an initialiser you
write, but how many things are initialised:  an expression is evaluated
for _each_ variable it is used to initialise.  It's not the way I'd prefer
it, but at least it is consistent and predictable.

LRM 3.7 paras 5 and 11.
LRM 3.2.1 (note para 6).