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=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,999932ecc319322a X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news3.google.com!news.glorb.com!newscon02.news.prodigy.com!newscon06.news.prodigy.com!prodigy.net!newsfeed-00.mathworks.com!nntp.TheWorld.com!not-for-mail From: Robert A Duff Newsgroups: comp.lang.ada Subject: Re: advice on package design Date: 12 Mar 2005 16:59:26 -0500 Organization: The World Public Access UNIX, Brookline, MA Message-ID: References: <1110212638.336123.298580@l41g2000cwc.googlegroups.com> <1gbk0qx2sgzpg$.sltzfssofla8$.dlg@40tude.net> <3jok3ghqqls8$.1rrsonb8jsurt$.dlg@40tude.net> NNTP-Posting-Host: shell01-e.theworld.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: pcls4.std.com 1110664766 8714 69.38.147.31 (12 Mar 2005 21:59:26 GMT) X-Complaints-To: abuse@TheWorld.com NNTP-Posting-Date: Sat, 12 Mar 2005 21:59:26 +0000 (UTC) User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 Xref: g2news1.google.com comp.lang.ada:9263 Date: 2005-03-12T16:59:26-05:00 List-Id: "Dmitry A. Kazakov" writes: > On 12 Mar 2005 14:57:17 -0500, Robert A Duff wrote: > > > If I were [re]designing Ada, I would make 'use' transitive. That is, > > if Foo says "use Linked_List" that would make the contents of > > Linked_List directly visible in Foo, and anything that says "use Foo;" > > would have direct visibility on everything directly visible in Foo -- > > not just the things *declared* in Foo. Or something like that. > > Yes, I really miss it. What about: > > use all ; > > or > > use package ; > > with the effect importing the specification of the package? Also, > differently to use, it should prevent hiding. So: > > package A is > Foo (X : Integer); > end A; > > with A; > package B is > use all A; > Foo (X : out Integer); -- Illegal, can't hide A.Foo > end B; Well, I happen to think that *all* hiding is evil. I would make the above legal, but all calls to Foo would be ambiguous, and therefore illegal. Ichbiah defined "Beaujolais Effect" to mean that if you add a subprogram to a use-d package, and that causes a legal program to change it's meaning (to another legal program) you have a Beaujolais Effect. And Beaujolais Effects are bad. Ada 83 had some Beaujolais Effects, but they were pretty obscure, and we eliminated them in Ada 95. But I think he should have extended that definition to include all visibility, not just use-visibility. So a local X should not hide a use-visible X, but be ambiguous with it. And similar rules for record (extension) components. In Pascal, a 'with' statement opens up the visibility of the record components, and if 'with R' is nested within some place where X is declared, then record component X hides that X. That's bad, and Ichbiah wisely designed 'use' clauses to not do that bad thing. The trick is to avoid "preference rules", where one decl takes precedence over another. But hiding is exactly a preference rule (preferring the inner one over an outer one, or preferring an outer one over a use-visible one). C++ is rife with Beaujolais Effects. - Bob P.S. The reason for the name is that Ichbiah offered to give a bottle (or was it a case?) of Beaujolais to anybody who could find such a problem in Ada.