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).