madmats@elma.epfl.ch (Mats Weber) (12/20/88)
In his message dated 3 Dec 88 21:08:16 GMT, mcvax!enea!sommar@uunet.uu.net (Erland Sommarskog) writes: > Generic > Type Data_type is limited private; > With procedure Assign(A : in out Data_type; > B : in Data_type); > With function "<"(A, B : Data_type) return boolean is <>; > With function ">"(A, B : Data_type) return boolean is <>; > Package Binary_trees is > >With an overloadable ":=" I could have declared the second parameter as > > With procedure ":="(A : in out Data_type; > B : in Data_type) is <>; > >This would save the user from declaring unnecessary Assign for types like >integer. This Assign procedure he has to write is simple, but is 100% noise >to his code. Instanciating and using this generic package with Standard.Integer (or any type that does not have a default initial value) is ERRONEOUS because the formal parameter A of Assign or ":=" is of mode 'in out', hence the corresponding actual paramter must be an initialized variable. For more information on this subject, read the paper by Genillard et al. "Rationale for the Design of Reusable Abstract Data Types Implemented in Ada" To appear soon in Ada Letters. Another document that should be read by anyone before even thinking of Ada 9x language changes is "Rationale for the Design of the Ada Programming Language" by Ichbiah et al. Mats Weber Swiss Federal Institute of Technology EPFL DI LITh 1015 Lausanne Switzerland e-mail : madmats@elma.epfl.ch
sommar@enea.se (Erland Sommarskog) (12/25/88)
Mats Weber (madmats@elma.epfl.ch) writes: >I said: >> Generic >> Type Data_type is limited private; >> With procedure Assign(A : in out Data_type; B : in Data_type); >> With function ">"(A, B : Data_type) return boolean is <>; >> With function "<"(A, B : Data_type) return boolean is <>; >> Package Binary_trees is >> >>With an overloadable ":=" I could have declared the second parameter as >> >> With procedure ":="(A : in out Data_type; B : in Data_type) is <>; >> >Instanciating and using this generic package with Standard.Integer (or any >type that does not have a default initial value) is ERRONEOUS because the >formal parameter A of Assign or ":=" is of mode 'in out', hence the >corresponding actual paramter must be an initialized variable. This is of course erroneous no matter if we call the procedure Assign or ":=". The interesting point is of course if the erroneousity here is really crucial. As long as we don't actually read A, it doesn't really matter. So for standard.integer there is no problem. But for types with range constraints there could appear an unexpected and unnecessary constraint_error. However, we can easily circumvent this with a surpress pragma for our Assign procedure. Now, WHY, is A of mode "in out" in the Assign procedure? If we had "out" only, nothing "erroneous" could occur. And, any user who wanted to store a limited type in a tree would get no help from us. (The Text type from Text_handler in the LRM is a perfect victim.) -- Erland Sommarskog ENEA Data, Stockholm This signature is not to be quoted. sommar@enea.se
billwolf@hubcap.clemson.edu (William Thomas Wolfe,2847,) (12/26/88)
From article <4189@enea.se>, by sommar@enea.se (Erland Sommarskog): > [Mats Weber and Erland Sommarskog rehash the argument about > assignment procedures having an "in out" parameter for the destination] > > Now, WHY, is A of mode "in out" in the Assign procedure? If we had > "out" only, nothing "erroneous" could occur. Because the ASSIGN procedure needs to be able to DESTROY the old value; DESTROY procedures must read objects during the process of destroying them. Please review the recent discussion rather than recreating it, unless there are new issues to be considered.
sommar@enea.se (Erland Sommarskog) (12/26/88)
Bill Wolfe (billwolf@hubcap.clemson.edu) writes: >From article <4189@enea.se>, by sommar@enea.se (Erland Sommarskog): >> [Mats Weber and Erland Sommarskog rehash the argument about >> assignment procedures having an "in out" parameter for the destination] >> >> Now, WHY, is A of mode "in out" in the Assign procedure? If we had >> "out" only, nothing "erroneous" could occur. > > Because the ASSIGN procedure needs to be able to DESTROY the old > value; DESTROY procedures must read objects during the process > of destroying them. Please review the recent discussion rather > than recreating it, unless there are new issues to be considered. Talk about rehash. We all know, except Bill of course, that the memory- management problem is best handled with garbage collection. As for the answer to the question above, the answer is simply that Generic Data_type is limited private; With procedure Assign(A : out Data_type; B : in Data_type); Package... is illegal. Parameters of a limited type may not be in "out" mode. This means, as Mats pointed out, that to use this package for type without a default value, like standard.integer, the user have to do something erroneous. I, in my turn, pointed out that this was not a problem in practice except for constrained types, and that this case also easily was handled with a "supress" pragma. Please read more carefully before you flame. We didn't talk about memory management. We didn't even talk about access types.-- Erland Sommarskog ENEA Data, Stockholm This signature is not to be quoted. sommar@enea.se