comp.lang.ada
 help / color / mirror / Atom feed
From: "Dan'l Miller" <optikos@verizon.net>
Subject: Re: Visibility of Indexing aspects
Date: Wed, 25 Jul 2018 11:26:34 -0700 (PDT)
Date: 2018-07-25T11:26:34-07:00	[thread overview]
Message-ID: <756cb66b-1ef8-4d9e-b679-118b6c59e89c@googlegroups.com> (raw)
In-Reply-To: <pj92bf$knt$1@franka.jacob-sparre.dk>

On Wednesday, July 25, 2018 at 12:37:53 AM UTC-5, Randy Brukardt wrote:
> I'm not even going to try to figure out what you are talking about. Perhaps 
> a few facts would help:
> 
> A private_type_declaration and a full_type_declaration are both 
> declarations, with their own visibility. But they declare different  *views* 
> of the *same* entity (a type in this case). Ada has many such pairs of 
> declarations (usually, the second one is called a completion, see 3.11.1). 
> Type aspects apply to the type, never the view, so the value is the same for 
> all views. There are some aspects which whether or not you can use them 
> depends on whether they are visible (given on the private type) -- but the 
> *value* of the aspect is the same for all views (it just might be hidden). 
> This model is carefully explained in 13.1 and 13.1.1.
> 
> > that clearly AdaCore interpreted differently than via this thread's logic
> 
> It's far more likely that they just made a mistake or omission. Let me give 
> you a bit of reality: 20-25% of new ACATS tests fail when run with the 
> latest compiler. (Those numbers hold for every Ada compiler that I've ever 
> tried.) Ada is simply too large for any implementer to even remember to 
> enforce every rule and implement every possible combination. The reason that 
> the ACATS is so important to Ada is that it provides at least a base line of 
> known-good tests that substantially reduce these.
> 
> Real Ada compiler development tends to be a slog through making ACATS and 
> other in-house tests work while being constantly interrupted with important 
> bugs to fix from one's customers. And then suddenly your boss and/or 
> customers are expecting a new version promised for July (OK, a bit personal 
> here :-) and you need it done yesterday. It's real easy in those conditions 
> to simply forget to do something (like apply visibility to an indexing 
> aspect); if the mistake doesn't show up in a test, it's likely to go 
> undetected until someone trips over it. That sort of thing is rarely an 
> intentional decision (although the occassional shortcut can happen, too, 
> where something is intentionally left unimplemented).
> 
>                                       Randy.
> 
> 
> 
> "Dan'l Miller" wrote in message 
> news:8720f70a-59b1-4297-b2fc-78804ec88b7b@googlegroups.com...
> On Monday, July 23, 2018 at 10:32:04 PM UTC-5, Randy Brukardt wrote:
> > "Jere" wrote in message
> > news:dbc94806-dbf9-408d-b8ad-3a159eb85b24@googlegroups.com...
> > ...
> > > Question:  Section 13.1.3 (1/3) says "The declaration with
> > > the aspect_specification is termed the associated declaration."
> > > In the case of the bugged example I gave, the aspect_specification
> > > was with the full view of the type.  Is that then considered the
> > > declaration of the type, or is just the partial view in the public
> > > section considered the declaration?  I am assuming the full view
> > > is still considered the declaration.
> >
> > They're two separate-but-related declarations. You can tell if something 
> > is
> > a declaration by looking at the name of its syntax. If the syntax includes
> > "_declaration",  then it's a declaration. And since we have
> > private_type_declaration and full_type_declaration, they're both
> > declarations. (See RM 3.1 for the more formal definitions.)
> >
> > There are implicit declarations as well, of course, but they don't have
> > anything to do with this particular question.
> 
> But where is "associated" (as quoted from the _LRM_) defined as clearly not 
> meaning "related" (as quoted from Randy's reply)?
> 
> AdaMagica overtly claims (and Randy less directly seems to affirm) that only 
> the private declaration of Container is "associated" in the _LRM_. 
> Conversely, Randy directly claims that the public declaration of Container 
> is "related" (but presumably not "associated").  Unless these "associated" 
> and "related" terms are given definitions overtly in the _LRM_ (or at least 
> illuminating-color commentary in the _AARM_), then relying the commonfolk 
> English dictionary definitions of "associated" and "related" do not give 
> definitions that definitively say that the public declaration of Container 
> is "related" but not "associated" to the private declaration of Container. 
> (This is what I mean a few replies ago about 'sloppy definitions'.)
> 
> And if this ambiguity (that clearly AdaCore interpreted differently than via 
> this thread's logic) is resolved by making the OP's code illegal, then what 
> would be the adjustment to the OP's code to attain that intended & evoked 
> feature (that would be otherwise removed)?  Would this be the replacement to 
> keep the Reference et. al. private?
> with Ada.Text_IO; use Ada.Text_IO;
> with Ada.Text_IO; use Ada.Text_IO;
> 
> procedure jdoodle is
>     package Containers is
> 
>       type Container is private
>         with Variable_Indexing => Reference;
> OR
>       type Container is private record
>         with Variable_Indexing => Reference;
> OR
>       type Container is private tagged record
>         with Variable_Indexing => Reference;
> 
>     private
> 
>       type Container_Array is array(1..20) of aliased Integer;
>       type Container is tagged record
>          Data : Container_Array := (others => 0);
>       end record;
> 
>       type Reference_Holder
>          (Element : not null access Integer)
>       is limited null record
>          with Implicit_Dereference => Element;
> 
>       function Reference
>          (Self  : aliased in out Container;
>           Index : Positive)
>           return Reference_Holder
>       is (Element => Self.Data(Index)'Access);
> 
>     end Containers;
> 
>     C : aliased Containers.Container;
> begin
>     for Index in 1 .. 20 loop
>         C(Index) := Index;
>         Put_Line(Integer'Image(C(Index)));
>     end loop;
> end jdoodle;

My point is this:  the work-around/fix
1) to the so-called “severe bug” of implicitly leaking private view's declarations into the public view of a package
is to
2) force the programmer to move the formerly-private declarations to be public declarations in that package.

Looking at it from a software engineering perspective** (of the package designer and the user of the package) instead of the compiler implementer, ••forcing the programmer•• to publicly textually leak intended-to-be-private declarations of his/her design is not any better than the •compiler• doing just the minimal amount of clever promotion of just the right pieces of private aspects to public.  #1 is deemed a so-called “severe bug” when the compiler actually successfully cleverly accomplishes the beneficial use-case of hiding of Reference et. al. in the private view, but #2 is admirably ‘working as designed’ when the programmer lets far more* private guts hang out in the public view of the package for all sorts of misuse/abuse by the users of the package.

* far more detail: all of {Reference, Reference_Holder, Container_Array, ...}

In the end, the intended use-case of privately hiding all of {Reference, Reference_Holder, Container_Array, ...} from misuse by users of the public interface of the package is •not• accomplished by option #2 nor by the _LRM_ as currently written.  At least #1's/OP's/GNAT's misinterpretation of the _LRM_ actually accomplished the use-case of inhibiting the misuse/abuse of Reference et. al.  Complying with the _LRM_ as currently written/designed is arguably worse than the so-called “severe bug”, when looked at from the discipline of software engineering** instead of a compiler writer (or language lawyer mechanically turning the crank of the _LRM_'s language).

** as Jean Ichbiah and HOLWG did

Effectively saying ‘Bah humbug’ to software engineering's intended use-case (of privately hiding all of {Reference, Reference_Holder, Container_Array, ...} from misuse by users of the public interface of the package) is arguably worse than the so-called “severe bug”.


  reply	other threads:[~2018-07-25 18:26 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-14 14:18 Visibility of Indexing aspects Jere
2018-07-14 17:04 ` Shark8
2018-07-14 18:29   ` Jere
2018-07-14 18:41     ` Dmitry A. Kazakov
2018-07-14 23:00     ` Shark8
2018-07-14 23:28       ` Jere
2018-07-15 14:41 ` AdaMagica
2018-07-15 15:33   ` Jere
2018-07-16  3:22     ` AdaMagica
2018-07-17  0:35       ` Jere
2018-07-17  9:46         ` AdaMagica
2018-07-17 10:11           ` AdaMagica
2018-07-20 12:08             ` Jere
2018-07-20 16:11               ` AdaMagica
2018-07-20 22:03                 ` Dan'l Miller
2018-07-20 22:07                 ` Jere
2018-07-21 10:33                   ` AdaMagica
2018-07-24  3:32                   ` Randy Brukardt
2018-07-24 17:15                     ` Dan'l Miller
2018-07-25  5:37                       ` Randy Brukardt
2018-07-25 18:26                         ` Dan'l Miller [this message]
2018-07-25 19:58                           ` AdaMagica
2018-07-25 20:57                             ` Dan'l Miller
2018-07-26  0:12                               ` Randy Brukardt
2018-07-26  2:41                                 ` Dan'l Miller
2018-07-26 19:09                                   ` Randy Brukardt
2018-07-26 20:31                                 ` Shark8
2018-07-26 21:25                                   ` Dan'l Miller
2018-07-27 22:05                                     ` Randy Brukardt
2018-07-28  0:35                                       ` Dan'l Miller
2018-07-27 21:58                                   ` Randy Brukardt
2018-07-20 22:23                 ` Jere
2018-07-20 22:25                   ` Jere
2018-07-21  5:58                   ` J-P. Rosen
  -- strict thread matches above, loose matches on Subject: below --
2018-08-02 20:31 Randy Brukardt
2018-08-03  0:43 ` Dan'l Miller
2018-08-03 20:56   ` Randy Brukardt
2018-08-03 21:32     ` Dan'l Miller
2018-08-06 21:46       ` Randy Brukardt
2018-08-06 22:12         ` Dmitry A. Kazakov
2018-08-07 15:13         ` Dan'l Miller
2018-08-07 22:41           ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox