From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Exception_Occurence and language designers Date: Tue, 5 Dec 2017 09:35:12 +0100 Organization: Aioe.org NNTP Server Message-ID: References: NNTP-Posting-Host: MyFhHs417jM9AgzRpXn7yg.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 X-Notice: Filtered by postfilter v. 0.8.2 Content-Language: en-US Xref: reader02.eternal-september.org comp.lang.ada:49375 Date: 2017-12-05T09:35:12+01:00 List-Id: On 05/12/2017 01:16, G. B. wrote: > Dmitry A. Kazakov wrote: >> On 2017-12-04 21:27, G. B. wrote: >>> Dmitry A. Kazakov wrote: >>> >>>> In Ada 83 exception was not a first-class type. >>> >>> Still isn’t. >> >> But its "class-wide" type Exception_Occurrence is. > > Exception_Occurrence feels like an enumeration, > to me at least, albeit of places in a program, > thus of a rather special set of “values”. "Enumeration" is Exception_Id. >> Then it became clear that the exception should carry >> user-defined and other information. > > User-defined information being strings, and > other information being places to be embedded in > strings, plus names of exceptions. > > How about this: the idea of creating normal, > typed objects as payload of wild jumps in > abnormal (exceptional) situations is rather optimistic. It is no matter what is freely typed, exception itself or the attached object. The problem is upward closures. Consider this: begin declare type Message_In_The_Bottle is new Controlled with ...; overriding procedure Finalize (E in out Message_In_The_Bottle); ... begin raise Hey with Message_In_The_Bottle'(...); end; exception when Error : Hey => -- The object of a dead type here This works in C++ because there all types are global. One possible solution is to have the type Root_Exception_Attachment and derive every exception-attached object type from there. When the scope of the type is left upon exception propagation the object will be demoted to its still existing parent. Apart from being not very useful and requiring a lot of overhead upon propagation, the existing Ada finalization model cannot handle this. The attached type's Finalize must be called upon conversion, but the parent's Finalize not. Then the added components must be finalized. Ada cannot such this now. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de