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: stopping a loop iteration without exiting it Date: Sat, 6 Jan 2018 18:20:41 +0100 Organization: Aioe.org NNTP Server Message-ID: References: <81971548-23c9-4927-a6a8-6f0f1dba896b@googlegroups.com> NNTP-Posting-Host: cfcJERb/54nsSDewC8aKwg.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 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 Content-Language: en-US X-Notice: Filtered by postfilter v. 0.8.2 Xref: reader02.eternal-september.org comp.lang.ada:49791 Date: 2018-01-06T18:20:41+01:00 List-Id: On 2018-01-06 17:50, Niklas Holsti wrote: > On 18-01-05 10:38 , Dmitry A. Kazakov wrote: >> On 2018-01-05 00:08, Niklas Holsti wrote: >>> On 18-01-04 23:17 , Dmitry A. Kazakov wrote: >>> > If we have > >    type Root is tagged ... > >    type T is new Root ... > >    type U is new Root ... > > the T'Class and U'Class do not overlap. But if "U is new T ..." then > they overlap. And what will be selected? The semantic of case is of mutually exclusive choices, so that the order of the choices were irrelevant. This is why if- or independent statements were preferable for type tests. However detection of overlapping alternatives would be nice for writing safe code. But that would require type ranges (see below) to resolve clashes and, that will not work in generics. (That mess taints everything) So, no chance. >> Differently to this case, which is logically OK: >> >>    case X'Tag is  -- Tag to denote "type"? >>       when Same_X : T => >>          ... >>       when Same_X : U =>  -- other instances >>          ... >>       when others =>  -- always required >>          ... >>    end case; > > That could be a different "case", which is not class-wide. It is same to me. Compare it with this: case Int is when 1 => -- Single value when 5..Integer'Last => -- A range of values T is a single type. T'Class is a range of types similar to 5..Integer'Last. Certainly definite ranges of types must be supported as well: X in T..S which same as X in T'Class and T in S'Class and (X in S or else X not in S'Class) But the point is that it is the type of X not its value as it appears when reading "case X is". >> However the idea of re-using exception handler style declarations could >> be very helpful in general cases. For example this is very frequent in >> parsers and protocol handlers: >> >>    declare >>       Symbol : constant Character := Get_Character; >>    begin >>       case Symbol is >>          when '0'..'9' => >>             -- Process digit >>          when 'A'..'Z' | 'a'..'z' => >>             -- Process letter >> >> Much better this: >> >>    case Get_Character is >>       when Digit : '0'..'9' => >>          -- Process digit >>       when Letter : 'A'..'Z' | 'a'..'z' => >>          -- Process letter > > Yes, that would be nice in such cases, and would perhaps be easier to > get approved by the ARG, because it should be completely compatible with > current Ada. I am afraid that would fall under the category "too simple to be approved", together with "raise when", "return when", "goto when". > The "case" forms with an (access to a) class-wide selector might > introduce some incompatibility because they would enlarge the set of > expected types of the selector expression. I think it has the same problem as with type tests. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de