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: Fri, 5 Jan 2018 09:38:40 +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:49763 Date: 2018-01-05T09:38:40+01:00 List-Id: On 2018-01-05 00:08, Niklas Holsti wrote: > On 18-01-04 23:17 , Dmitry A. Kazakov wrote: > >    [snip] > >> I thought about really important cases, but could not invent syntax: >> >>    if X in T'Class then >>       declare >>          Same_X : T'Class renames T'Class (X); >>       begin >>          ... >>       end; >>    end if; > > A syntax suggestion, drawing on analogy with exception handlers: > >    case X is >    when Same_X : T'Class => >       ... >    when Same_X : U'Class =>  -- other named classes >       ... >    when others =>  -- always required >       ... >    end case; > > This would be legal only if no two classes in the "whens" are related > with "in", so that at most one "when S'Class" matches X. It looks nice, but is inconsistent, at least logically. T'Class and U'Class always overlap. 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; >>    if P /= null then >>       declare >>          X : P_Type renames P.all; >>       begin >>          ... >>       end; >>    end if; > > Similarly, applying an implicit dereference to the selecting expression > when it has an access type: > >    case P is >    when X : P_Type => >       ... >    when null =>  -- or "when others =>" >       ... >    end case; But as heavy weight as if-declare ... 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 -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de