comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Studying and Maintaining GNAT, Is There Any Interest in a New Group?
Date: Tue, 28 Aug 2018 19:16:19 -0500
Date: 2018-08-28T19:16:19-05:00	[thread overview]
Message-ID: <pm4okm$a8o$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: pm2tfi$1sv1$1@gioia.aioe.org

"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message 
news:pm2tfi$1sv1$1@gioia.aioe.org...
> On 2018-08-27 23:27, Randy Brukardt wrote:
>> "Lucretia" <laguest9000@googlemail.com> wrote in message
>> news:1ceec6d8-c5c4-49b1-9808-a3580bba3f8e@googlegroups.com...
>> ...
>>> I never said anything about not learning from DIANA, I said don't
>>> implement it. Reason is simple, it was designed using Ada83, we have
>>> OO now and OO fits a compiler perfectly and would be a hell of a lot
>>> nicer than a bunch of variant records/enums.
>>
>> Fitting OO into a compiler design could very easily turn into a nightmare 
>> of
>> required overriding routines, making it very painful to add new kinds of
>> nodes.
>
> Which is not even possible with variant records. Enumeration types are not 
> extensible and have no classes anyway to allow building a *comparable* 
> case. E.g.
>
>    type Choice is (A, B);
>    type Var (Mode : Choice) is record
>       case Mode is
>          when A => ...
>          when B => ...
>       end case;
>    end record;
>
> 1. How do you extend Choice:

Why would you want to? In the case of something like a compiler, there is no 
reason to extend anything rather than simply modifying it to add the 
additional capabilities. (That probably goes for anything whose code doesn't 
have a sane reuse case, which in my experience is a substantial portion of 
any program.) Certainly in a viable compiler, you have ownership on all of 
the node types, so modifying them is not the issue it might be with code 
that is reusable.

So to add a new kind of node, you just add additional enumeration literal C 
to Choice. And the Ada compiler will complain if you forget to add C to any 
case statements (assuming you avoided the use of "others"). And you'll get 
runtime errors if you access the wrong variant. It's not even worth the time 
to try to find everything thta needs to be modified -- I generally just 
change the things I know about and let compilation and testing (which is 
easy and extensive for a compiler) find the rest.

>    type Choice_Ext is new Choice with (C, D, E); -- This not Ada
>
> 2. How do you declare Var to accept any descendant of Choice as a 
> discriminant?
>
>    type Var (Mode : Choice'Class) is record -- This not Ada

There aren't any descendants of Choice, so this is not a problem. Indeed, I 
can't imagine any value whatsoever to using extension in this case -- it's 
really only useful as part of OO designs.

> 3. How do you extend the variant record Var contains?
>
>    type Var_Plus (Mode : Choice_Ext) is new Var with ? -- This not Ada

Just modify Var with your favorite editor. Not everything benefits from 
extension.

Case in point: I recently added new node types into Janus/Ada for the 
various Ada 2012 expressions (if expression, raise expression, etc.). This 
was done by just adding them to the existing node type. There isn't any 
reason to have them in a separate type (even if you're operating in Ada 95 
mode, you could still encounter the nodes if some withed unit was compiled 
in Ada 2012 mode). It's just additional support.

Now, obviously a full OO design would have each node kind supported by a 
separate type. But even there, you wouldn't separate them from the others 
(you never want or care about specifically Ada 95 nodes).

> Since nothing of that kind is possible, what you propose is monolithic 
> design AKA "god-class", when the variant record must know *in advance* all 
> future "extensions", which are extensions no more.

Why in advance? One *modifies* code in maintenance; one doesn't tie both 
hands behind your back! It's hard enough to work on a compiler without 
making arbitrary rules preventing the modification of types.

> You will need to change the declarations of Choice and Var each time and 
> then revisit all client code they appear.

Yes, of course. And Ada makes this easy to do safely.

> And if the above were possible, how would it be different from inheritance 
> as we know it?

Inheritance is nearly useless! It helps a tiny bit in code reuse, but it is 
better still to only write the code once! Having to write dozens of 
overridding subprograms that don't actually add any semantics is just busy 
work of no value.

                                           Randy.



  reply	other threads:[~2018-08-29  0:16 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-25 12:27 Studying and Maintaining GNAT, Is There Any Interest in a New Group? patrick
2018-08-25 13:56 ` Dan'l Miller
2018-08-25 16:00   ` patrick
2018-08-25 16:16 ` Luke A. Guest
2018-08-25 17:42   ` patrick
2018-08-25 19:25     ` Simon Wright
2018-08-25 20:24       ` patrick
2018-08-25 21:48         ` Luke A. Guest
2018-08-25 21:53           ` patrick
2018-08-25 22:05             ` Luke A. Guest
2018-08-26 19:54           ` Dan'l Miller
2018-08-26 20:14             ` Dan'l Miller
2018-08-26 22:52             ` Lucretia
2018-08-27  2:38               ` Dan'l Miller
2018-08-27 14:46                 ` Lucretia
2018-08-27 15:42                   ` Dan'l Miller
2018-08-27 21:27               ` Randy Brukardt
2018-08-28  7:26                 ` Dmitry A. Kazakov
2018-08-29  0:16                   ` Randy Brukardt [this message]
2018-08-29  8:20                     ` Dmitry A. Kazakov
2018-08-29 21:43                       ` Randy Brukardt
2018-08-30  7:55                         ` Dmitry A. Kazakov
2018-08-30 23:25                           ` Randy Brukardt
2018-08-31  8:48                             ` Dmitry A. Kazakov
2018-08-31 22:42                               ` Randy Brukardt
2018-09-02  8:02                                 ` Dmitry A. Kazakov
2018-09-04 22:18                                   ` Randy Brukardt
2018-08-29  3:02                 ` Paul Rubin
2018-08-29  6:18                   ` Luke A. Guest
2018-08-29 19:00                     ` Paul Rubin
2018-08-30  5:54                       ` Luke A. Guest
2018-08-30  6:29                         ` Paul Rubin
2018-08-27 21:18             ` Randy Brukardt
2018-08-27  9:37           ` Simon Wright
2018-08-27 16:54             ` Bill Findlay
2018-08-27 17:42               ` Shark8
2018-08-31 21:23                 ` Robert A Duff
2018-08-31 22:51                   ` Randy Brukardt
2018-09-01 19:42                     ` Robert A Duff
2018-09-02  8:04                       ` Dmitry A. Kazakov
2018-09-02 10:11                     ` AdaMagica
2018-09-02 12:10                       ` Jeffrey R. Carter
2018-09-02 14:30                         ` AdaMagica
2018-09-04 22:05                           ` Randy Brukardt
2018-09-01  7:41               ` Simon Wright
2018-09-01 17:27                 ` Bill Findlay
2018-08-27 17:35         ` Shark8
2018-08-25 21:17       ` Luke A. Guest
2018-08-25 23:16       ` Paul Rubin
2018-08-26  8:03         ` Rene
2018-08-26 10:09         ` Simon Wright
2018-08-25 16:43 ` Jeffrey R. Carter
2018-08-25 17:38   ` patrick
2018-08-25 17:39     ` Luke A. Guest
2018-08-25 17:45       ` patrick
replies disabled

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