comp.lang.ada
 help / color / mirror / Atom feed
From: Maciej Sobczak <see.my.homepage@gmail.com>
Subject: Re: Ada Annoyances
Date: Mon, 26 Jun 2017 13:35:31 -0700 (PDT)
Date: 2017-06-26T13:35:31-07:00	[thread overview]
Message-ID: <71c4fdcd-4213-4b84-b852-c8674cfaf717@googlegroups.com> (raw)
In-Reply-To: <oipj61$pdq$1@franka.jacob-sparre.dk>

> C++ needs this model

In other words, what it offers is complete. Sounds fair.

> In Ada, where redispatching requires explicit work, the vast 
> majority of constructors will never make a dispatching call so there is very 
> little risk.

The vast majority? Where does this statistics come from?
I expect programmers to delegate initialization of the base parts to the initialization procedure that was already written for the base part, like here:

      procedure Initialize (Obj : in out Derived) is
      begin
         -- initialize Base part:
         Initialize (Base (Obj));
         
         -- initialize Derived part:
         -- ...
      end Initialize;

I'm not sure whether this is majority or minority, but the idiom seems to be intuitive. The problem is - even though the view conversion is explicit here, the dispatching call in the Base version of Initialize is not and it is there, where the potentially unsafe action can occur. These two places can be in separate files, written by different programmers. If you decouple explicit from unsafe, this is no longer in the Ada spirit.

The complete example (analogous to the C++ example I have written in the other post) is:

with Ada.Text_IO;
with Ada.Finalization;

procedure Test is
   
   package P is
      type Base is new Ada.Finalization.Limited_Controlled with null record;
      
      procedure Initialize (Obj : in out Base);
      procedure VFoo (Obj : in Base);
      
      type Derived is new Base with null record;
      
      procedure Initialize (Obj : in out Derived);
      procedure VFoo (Obj : in Derived);
      
      procedure Use_Object (Obj : in Base'Class);
   end P;
   
   package body P is
      procedure Initialize (Obj : in out Base) is
      begin
         Ada.Text_IO.Put_Line ("   call from Base's Initialize");
         Use_Object (Obj);
      end Initialize;
      
      procedure VFoo (Obj : in Base) is
      begin
         Ada.Text_IO.Put_Line ("      Hello from Base");
      end VFoo;
      
      procedure Initialize (Obj : in out Derived) is
      begin
         -- initialize Base part:
         Initialize (Base (Obj));
         
         Ada.Text_IO.Put_Line ("   call from Derived's Initialize");
         Use_Object (Obj);
      end Initialize;
      
      procedure VFoo (Obj : in Derived) is
      begin
         Ada.Text_IO.Put_Line ("      Hello from Derived");
      end VFoo;
      
      procedure Use_Object (Obj : in Base'Class)  is
      begin
         VFoo (Obj);
      end Use_Object;
   end P;
   
begin
   Ada.Text_IO.Put_Line ("test with Base");
   declare
      B : P.Base;
   begin
      null;
   end;
   
   Ada.Text_IO.Put_Line ("test with Derived");
   declare
      D : P.Derived;
   begin
      null;
   end;
end Test;

When executed, we get:

test with Base
   call from Base's Initialize
      Hello from Base
test with Derived
   call from Base's Initialize
      Hello from Derived   <<<<<<< here are dragons!
   call from Derived's Initialize
      Hello from Derived


> In any case, this problem is irrelevant.

So guess how did I learn about it...

> The net takeaway is that a truly type-safe language maybe could be 
> constructed,

Yes. C++ got that part right.

-- 
Maciej Sobczak * http://www.inspirel.com

  reply	other threads:[~2017-06-26 20:35 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-21  1:12 Ada Annoyances pythoner6
2017-06-21 10:13 ` Lucretia
2017-06-23 15:27   ` raph.amiard
2017-06-23 17:49     ` Randy Brukardt
2017-06-23 19:21       ` Niklas Holsti
2017-06-24  4:02         ` Shark8
2017-06-24 19:55         ` Simon Wright
2017-06-24 20:56           ` Niklas Holsti
2017-06-25 23:43         ` Randy Brukardt
2017-06-26 20:20           ` Niklas Holsti
2017-06-26 21:47             ` Randy Brukardt
2017-06-26 22:23               ` Dmitry A. Kazakov
2017-06-29 19:00               ` Niklas Holsti
2017-06-29 21:29                 ` Robert A Duff
2017-06-30  0:50                   ` Randy Brukardt
2017-07-03 20:39                     ` Robert A Duff
2017-07-04 19:52                       ` Niklas Holsti
2017-07-04 19:32                   ` Niklas Holsti
2017-06-30  0:47                 ` Randy Brukardt
2017-06-30 18:45                   ` Niklas Holsti
2017-06-30 20:06                     ` Robert A Duff
2017-06-29 21:12         ` Robert A Duff
2017-07-04 19:30           ` Niklas Holsti
2017-07-05 20:03             ` Robert A Duff
2017-06-23 19:22       ` Niklas Holsti
2017-06-30 15:02       ` Norman Worth
2017-06-30 23:49         ` pythoner6
2017-07-03  0:04           ` Randy Brukardt
2017-07-03 17:47             ` Jere
2017-07-03 19:43               ` Dmitry A. Kazakov
2017-07-04  2:18               ` Randy Brukardt
2017-12-17 13:47                 ` Prefixed notation for non tagged types Jere
2017-12-17 15:06                   ` Simon Wright
2017-12-17 15:33                     ` Dmitry A. Kazakov
2017-12-18 22:31                     ` Randy Brukardt
2017-12-19  0:40                     ` Jere
2017-12-19 23:04                       ` Randy Brukardt
2017-12-20 12:33                         ` Robert Eachus
2017-06-21 11:58 ` Ada Annoyances joakimds
2017-06-21 12:29   ` Pascal Obry
2017-06-21 14:52     ` pythoner6
2017-06-21 16:11       ` J-P. Rosen
2017-06-21 16:12       ` Dmitry A. Kazakov
2017-06-21 22:45         ` pythoner6
2017-06-22  7:29           ` Dmitry A. Kazakov
2017-06-22 10:29             ` pythoner6
2017-06-22 11:04               ` Egil H H
2017-06-22 13:30               ` Dmitry A. Kazakov
2017-06-22 19:22                 ` Niklas Holsti
2017-06-22 21:52                   ` Dmitry A. Kazakov
2017-06-23  9:33                     ` AdaMagica
2017-06-23 10:25                       ` Simon Wright
2017-06-23  1:00                 ` pythoner6
2017-06-23 15:23         ` raph.amiard
2017-06-23 16:10           ` Dmitry A. Kazakov
2017-06-23 17:41           ` Randy Brukardt
2017-06-23 18:56           ` Maciej Sobczak
2017-06-23 22:18             ` pythoner6
2017-06-24  8:05               ` Dmitry A. Kazakov
2017-06-24  8:35                 ` Maciej Sobczak
2017-06-24  9:07                   ` Dmitry A. Kazakov
2017-06-24 20:50                     ` Maciej Sobczak
2017-06-24 21:06                       ` Dmitry A. Kazakov
2017-06-25 11:33                         ` Maciej Sobczak
2017-06-25 14:32                           ` Dmitry A. Kazakov
2017-06-25 20:50                             ` Maciej Sobczak
2017-06-26  7:58                               ` Dmitry A. Kazakov
2017-06-26 13:24                                 ` Maciej Sobczak
2017-06-26 16:38                                   ` Dmitry A. Kazakov
2017-06-26 20:42                                     ` Maciej Sobczak
2017-06-24  8:34               ` Maciej Sobczak
2017-06-24 13:06                 ` pythoner6
2017-06-24 15:40                   ` Dmitry A. Kazakov
2017-06-26  0:06                 ` Randy Brukardt
2017-06-26 20:35                   ` Maciej Sobczak [this message]
2017-06-26 21:40                     ` Randy Brukardt
2017-06-27  7:23                       ` Maciej Sobczak
2017-06-27 20:38                         ` Randy Brukardt
2017-06-28  8:21                           ` Dmitry A. Kazakov
2017-06-28 20:50                             ` Randy Brukardt
2017-06-28 23:18                               ` Nasser M. Abbasi
2017-06-29  7:27                                 ` Dmitry A. Kazakov
2017-06-29 16:24                                 ` Jeffrey R. Carter
2017-06-29 16:51                                   ` Nasser M. Abbasi
2017-07-04 23:40                                   ` Luke A. Guest
2017-07-05  5:29                                     ` J-P. Rosen
2017-07-05 13:49                                       ` Dennis Lee Bieber
2017-07-05 17:49                                     ` Jeffrey R. Carter
2017-06-29 21:46                                 ` darkestkhan
2017-06-29  7:15                               ` Dmitry A. Kazakov
2017-06-30  0:42                                 ` Randy Brukardt
2017-06-30  7:36                                   ` Dmitry A. Kazakov
2017-06-28 13:07                           ` Maciej Sobczak
2017-06-27  7:26                       ` Dmitry A. Kazakov
2017-06-27 20:41                         ` Randy Brukardt
2017-06-28  7:57                           ` Dmitry A. Kazakov
2017-06-27 15:19                     ` AdaMagica
2017-06-27 16:32                       ` Dmitry A. Kazakov
2017-06-28 13:15                       ` Maciej Sobczak
2017-06-28 14:05                         ` AdaMagica
2017-06-29 21:17                           ` Robert A Duff
2017-06-30  7:44                             ` Dmitry A. Kazakov
2017-06-30  7:49                               ` J-P. Rosen
2017-06-30  8:28                                 ` Dmitry A. Kazakov
2017-06-30 10:14                                   ` J-P. Rosen
2017-06-30 10:30                                     ` Dmitry A. Kazakov
2017-06-28 20:53                         ` Randy Brukardt
2017-12-17 16:24             ` Mehdi Saada
2017-12-17 17:27               ` Dmitry A. Kazakov
2017-12-18 23:09                 ` Randy Brukardt
2017-12-19  9:25                   ` Dmitry A. Kazakov
2017-06-21 20:40       ` G.B.
2017-06-21 22:25         ` pythoner6
2017-06-26 11:01     ` Vincent
2017-06-26 11:15       ` Alejandro R. Mosteo
2017-06-26 16:35       ` Pascal Obry
replies disabled

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