comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Derived private interface
Date: Sat, 23 Jul 2011 12:07:34 +0200
Date: 2011-07-23T12:07:34+02:00	[thread overview]
Message-ID: <uzhsh61k7zma$.doff2a2ppxdx.dlg@40tude.net> (raw)
In-Reply-To: j0e0l1$5qh$1@tornado.tornevall.net

On Sat, 23 Jul 2011 00:30:12 -0700, Jeffrey Carter wrote:

> Maybe I'm missing something, but it seems to me that all dispatching in Ada is 
> related to extensions.

Yes, but that is a language design bug (sorry, feature (:-)). There is
nothing in the idea of a class of types which would instruct a derived type
to add new components, and not to discard existing components, or to
provide an absolutely unrelated implementation.

Extension is an invention of lazy language designers.

> type T2 is new T with ...
> 
> overriding procedure P (V : in out T2);
> 
> Then you can get a single call that sometimes calls P for T and other times P 
> for T2; that's dispatching.

No, it always means the *same* primitive operation P defined on the type
T'Class. P for T is defined on T, P for T2 is defined on T2. Neither is
defined on T'Class.

In Ada you always know which operation is to be called.

> I don't know what dispatching means without an 
> extension and an overridden subprogram to dispatch to.

If you mean the implementation of a primitive operation P, then how is it
different from other operations? Ada separates interface and
implementation. You newer know the implementation without looking into the
body(es).

> The equivalent of dispatching in programming by composition is a subprogram that 
> contains a case statement that contains calls to other subprograms. No 
> access-to-subprogram values involved. It does the exact same thing as 
> dispatching, except that it's easier to read and understand and doesn't result 
> in large numbers of "what am I doing wrong?" posts to c.l.a.

There is a sufficient difference. The case statement needs an enumeration
type (a substitute for the tag type) which should be declared in advance to
all future implementations. This means that you have to know all derived
types at a very early stage of the project. Certainly you don't want
"others =>" in that statement. Furthermore the procedure must "with" all
implementations of all derived types. Now you have:

1. Problems with maintenance (fixing the statement and with clauses)

2. You have to ensure the correspondence between the values of the
enumeration type and the procedures called in "when This => That (X);". The
language cannot help you here.

3. Potential problems with elaboration order (inversed, mutual
dependencies).

4. Lack of static check if each "derived" type has a defined body.

5. Lack of abstract types. An abstract type has no instances, but may have
implementations. I.e. it appear in the switch. But you cannot compose
abstract components. Once abstract always abstract.

And finally, it does not change anything semantically. Whatever problem
(substitutability issues / LSP) the programmer might have with tagged
types, he will under composition.

> In Ada, "programming by extension" is achieved by the use of tagged types; it 
> includes dispatching. I have never seen anything implemented using tagged types 
> that could not also be implemented using programming by composition. It follows 
> that if there is a case where tagged types cause a problem, the equivalent 
> solution without tagged types is an effective work around to the problem.
> 
> Of course, in the case where there is no solution using tagged types, there may 
> also be no solution without using them.

An argument to Turing-completeness? (:-))

Compare: I never saw anything written in Ada, that could not be implemented
in Assembler...

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  parent reply	other threads:[~2011-07-23 10:07 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-05  3:14 Derived private interface Rego, P.
2011-07-05  5:10 ` AdaMagica
2011-07-06  2:24   ` Rego, P.
2011-07-06  4:34   ` AdaMagica
2011-07-06  7:55     ` Georg Bauhaus
2011-07-06  8:30       ` AdaMagica
2011-07-06 12:59         ` Georg Bauhaus
2011-07-06 13:23           ` AdaMagica
2011-07-06 19:06             ` Randy Brukardt
2011-07-06 13:28           ` Simon Wright
2011-07-06 19:45           ` Randy Brukardt
2011-07-06 22:05             ` Georg Bauhaus
2011-07-06 23:56               ` Adam Beneschan
2011-07-07 14:09                 ` Georg Bauhaus
2011-07-07 15:10                   ` Adam Beneschan
2011-07-08  4:29                     ` AdaMagica
2011-07-08 19:08                       ` Randy Brukardt
2011-07-08 19:12                     ` Randy Brukardt
2011-07-07 15:19                   ` Georg Bauhaus
2011-07-07 10:37         ` Stephen Leake
2011-07-07 13:18           ` Georg Bauhaus
2011-07-08 19:23             ` Randy Brukardt
2011-07-08 21:41               ` Jeffrey Carter
2011-07-09  6:14                 ` Dmitry A. Kazakov
2011-07-22 22:59                 ` Randy Brukardt
2011-07-23  7:30                   ` Jeffrey Carter
2011-07-23  9:29                     ` Maciej Sobczak
2011-07-23 10:07                     ` Dmitry A. Kazakov [this message]
2011-07-26 21:04                     ` Randy Brukardt
2011-07-26 23:43                       ` Jeffrey Carter
2011-07-27 23:56                         ` Randy Brukardt
2011-07-28  0:18                           ` Jeffrey Carter
2011-07-28 10:06                         ` Maciej Sobczak
2011-07-28 23:24                           ` Randy Brukardt
2011-07-29  6:45                             ` Simon Wright
2011-07-30  0:04                               ` Randy Brukardt
2011-07-30  6:32                                 ` Simon Wright
2011-08-01  9:30                                   ` Alex R. Mosteo
2011-08-01 10:12                                     ` Dmitry A. Kazakov
2011-08-01 21:56                                       ` Randy Brukardt
2011-08-02 10:03                                         ` Dmitry A. Kazakov
2011-08-02 21:16                                           ` Randy Brukardt
2011-08-03  9:01                                             ` Dmitry A. Kazakov
2011-08-03 20:16                                               ` Randy Brukardt
2011-08-04  8:15                                                 ` Dmitry A. Kazakov
2011-08-09 21:10                             ` Maciej Sobczak
2011-08-09 21:35                               ` Randy Brukardt
2011-08-10  9:11                                 ` Dmitry A. Kazakov
2011-08-10 21:56                                   ` Randy Brukardt
2011-08-11  8:07                                     ` Dmitry A. Kazakov
2011-08-12  4:52                                       ` Randy Brukardt
2011-08-12  8:54                                         ` Dmitry A. Kazakov
2011-08-10 10:07                                 ` Maciej Sobczak
2011-08-10 11:26                                   ` Georg Bauhaus
2011-08-10 22:27                                     ` Randy Brukardt
2011-08-10 22:21                                   ` Randy Brukardt
2011-08-11 13:50                                     ` Maciej Sobczak
2011-08-12  4:43                                       ` Randy Brukardt
2011-08-12  7:00                                         ` Maciej Sobczak
2011-08-12 21:59                                           ` Randy Brukardt
2011-07-06 15:06       ` Adam Beneschan
2011-07-06 16:36       ` Dmitry A. Kazakov
2011-07-06 19:20       ` 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