comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada Interfaces and the Liskov Substitution Principle
Date: Tue, 5 Jun 2007 10:35:52 +0200
Date: 2007-06-05T10:33:25+02:00	[thread overview]
Message-ID: <1lzp9p6pnkazp$.17gvbzz8nm6mo$.dlg@40tude.net> (raw)
In-Reply-To: 1180976568.313756.322280@q66g2000hsg.googlegroups.com

On Mon, 04 Jun 2007 10:02:48 -0700, Maciej Sobczak wrote:

> On 4 Cze, 10:08, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
> wrote:
> 
>>> I was talking about access Object'Class with Circle and Triangle being
>>> both derived from Object.
>>
>> What is the difference between the types access T'Class and T'Class?
> 
> Access T'Class can be reseated to point to some other object from
> T'Class, even if that other object has different tag.

So what? According to you that is wrong because there exist n*n possible
combinations of such assignments for different tags. In what sense these
combinations are different for T'Class and access T'Class?

>>> We are going in circles. I say T'Class should be limited.
>>> Even if T is not.
>>
>> If I'd say access T'Class should be limited even if T is not?
> 
> No, access Whatever should not be unconditionally limited, otherwise
> there would be little justification for its existence in the type
> system.
> The raison d'etre for access T is the ability to *point* - and be
> *reseated*.

While for T'Class it is the ability to accommodate any specific T. Where is
a difference?

> There are fundamental reasons for which assignment for T'Class doesn't
> make sense (it would lead to objects that can change type at runtime -
> you cannot get further away from Ada than that) and no matter what
> magic you try, you will always hit the same wall.
> Consider (again):
> 
> procedure Swap(X : in out Object'Class; X in out Object'Class)
> begin
>    -- whatever
> end Swap;
> 
> and then:
> 
> declare
>   X : Triangle;
>   Y : Circle;
> begin
>   Swap(X, Y);

procedure Swap (X, Y : in out String);

declare
   X : String := "abc";
   Y : String := "klmnoprst";
begin
   Swap (X, Y);
   -- oops

Why your "fundamental" reasons do not apply here?

The only truly fundamental reason is that if Object was declared
non-limited, then its contract is to support assignment. It is then the
programmer responsibility to fulfill this contract for Triangle and Circle.
Don't blame the language for your own design faults.

>> Wrong. These are independent. Double dispatch controls the choice of the
>> specific body, it tells nothing about how this body has to be assembled.
> 
> Yes, but this shows that assignment in Ada cannot be modeled by any
> hypothetical Assign subprogram. No analogies here. This in turn means
> that introducing full double-dispatch to the discussion doesn't help
> much, because implementing it would not be at all similar to anything.

It is still independent. The thing is not fully decomposable into
subprograms because that would require type violation, which is impossible
in a typed language. Therefore some magic is needed to convert raw memory
to an object and back. This is irrelevant to dispatch. And if that were a
reason to forbid assignments, then *any* assignment would become illegal.

Because magic is needed, assignment, construction and destruction will
always be compiler-generated with some injections of user-defined
subprograms at the points where necessary [sub]objects are fully
constructed/destructed. This is no different from polymorphic subprograms,
they are also compiler-generated.

>> My approach, not shared here, is that the programmer should have more
>> control over this, when he wants.
> 
> Hm... do we agree again? :-)

No, because you want to disallow assignment altogether, others want to keep
it albeit sometimes inconsistent, but I want to change the language to have
a way to enforce its consistency.

> - constructors cannot be polymorphic, since there is no tag yet (you
> might dispatch on something different, though, but this is irrelevant)

There is the tag, it exists before the object and comes from the type of. A
constructor (actually a part of) dispatches on the bare tag. I posted a
description of my view on this some time ago:

http://groups.google.com/group/comp.lang.ada/browse_thread/thread/72c34c66b38e0e05/b4b6668d530912ac?lnk=gst&q=kazakov+construction&rnum=6#b4b6668d530912ac
 
>> In a better
>> language one should be able to describe all these decompositions uniformly,
>> with a higher-level mechanism of polymorphic subprograms.
> 
> Not really. The problem is that these things work on the border of
> object's life and death and for this reason they cannot be first-class
> citizens in the world of polymorphic operations.

The same applies to primitive operations. Dispatch happens per magic. I
suppose there is a more general mechanism based on types constraints. But
in any case it will be "magical." But that will be the only magic
necessary.

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



  reply	other threads:[~2007-06-05  8:35 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-23 19:47 Ada Interfaces and the Liskov Substitution Principle Stefan Lucks
2007-05-23 20:32 ` Ludovic Brenta
2007-05-23 22:00   ` Randy Brukardt
2007-05-24  0:56     ` Anh Vo
2007-05-24 18:27     ` Pascal Obry
2007-05-24 18:39       ` Dmitry A. Kazakov
2007-05-24 18:51         ` Pascal Obry
2007-05-24 22:44         ` Randy Brukardt
2007-05-24  6:57   ` Stefan Lucks
2007-05-23 20:54 ` Maciej Sobczak
2007-05-23 21:58   ` Randy Brukardt
2007-05-24  7:29     ` Maciej Sobczak
2007-05-24  8:02       ` Dmitry A. Kazakov
2007-05-24 12:58         ` Maciej Sobczak
2007-05-24 13:42           ` Dmitry A. Kazakov
2007-05-24 22:08           ` Robert A Duff
2007-07-01  1:00             ` David Thompson
2007-05-24 22:58           ` Randy Brukardt
2007-05-25  7:52             ` Maciej Sobczak
2007-05-25  8:21               ` Dmitry A. Kazakov
2007-05-25 20:27                 ` Maciej Sobczak
2007-05-26  7:48                   ` Dmitry A. Kazakov
2007-05-27  8:30                     ` Maciej Sobczak
2007-05-27 10:04                       ` Dmitry A. Kazakov
2007-05-29  8:03                         ` Maciej Sobczak
2007-05-29 13:18                           ` Dmitry A. Kazakov
2007-05-29 13:32                             ` Dmitry A. Kazakov
2007-05-29 15:34                             ` Maciej Sobczak
2007-05-29 17:07                               ` Dmitry A. Kazakov
2007-05-30  7:40                                 ` Maciej Sobczak
2007-05-30  8:43                                   ` Dmitry A. Kazakov
2007-05-30 12:54                                     ` Maciej Sobczak
2007-05-30 13:56                                       ` Dmitry A. Kazakov
2007-05-30 16:49                                         ` vgodunko
2007-05-30 20:52                                         ` Maciej Sobczak
2007-05-31  8:15                                           ` Dmitry A. Kazakov
2007-05-31 13:46                                             ` Maciej Sobczak
2007-06-01  7:29                                               ` Dmitry A. Kazakov
2007-06-01 13:32                                                 ` Maciej Sobczak
2007-06-01 14:53                                                   ` Dmitry A. Kazakov
2007-06-01 20:31                                                     ` Maciej Sobczak
2007-06-02  8:19                                                       ` Dmitry A. Kazakov
2007-06-02 16:49                                                         ` Maciej Sobczak
2007-06-03  7:09                                                           ` Dmitry A. Kazakov
2007-06-03 22:04                                                             ` Maciej Sobczak
2007-06-04  8:08                                                               ` Dmitry A. Kazakov
2007-06-04 17:02                                                                 ` Maciej Sobczak
2007-06-05  8:35                                                                   ` Dmitry A. Kazakov [this message]
2007-06-05 22:12                                                                     ` Maciej Sobczak
2007-06-06  8:21                                                                       ` Dmitry A. Kazakov
2007-06-06 14:46                                                                         ` Maciej Sobczak
2007-06-06 15:11                                                                           ` Maciej Sobczak
2007-06-06 15:32                                                                       ` Markus E Leypold
2007-05-24 10:42       ` Georg Bauhaus
2007-05-24 13:41         ` Dmitry A. Kazakov
2007-05-25 16:59         ` Markus E Leypold
2007-05-28  9:52           ` Georg Bauhaus
2007-05-28 11:50             ` Dmitry A. Kazakov
2007-05-28 23:32               ` Georg Bauhaus
2007-05-29 12:05                 ` Dmitry A. Kazakov
2007-05-29 13:33                 ` Georg Bauhaus
2007-05-29 17:29                   ` Dmitry A. Kazakov
2007-05-29 20:46                     ` Georg Bauhaus
2007-05-30  7:53                       ` Dmitry A. Kazakov
2007-05-30 13:18                       ` Georg Bauhaus
2007-05-31 10:27                         ` Dmitry A. Kazakov
2007-05-31 11:44                         ` Georg Bauhaus
2007-06-01  7:37                           ` Dmitry A. Kazakov
2007-06-01 10:07                             ` Markus E Leypold
2007-06-01 11:41                             ` Georg Bauhaus
2007-06-01 13:07                               ` Dmitry A. Kazakov
2007-05-28 13:47             ` Markus E Leypold
2007-05-28 23:12               ` Georg Bauhaus
2007-05-28 13:56             ` Markus E Leypold
2007-05-28 23:00               ` Georg Bauhaus
2007-05-24  7:39 ` Dmitry A. Kazakov
2007-05-24 11:12   ` Stefan Lucks
2007-05-24 13:56     ` Dmitry A. Kazakov
2007-05-24 14:41       ` Stefan Lucks
2007-05-24 15:46         ` Dmitry A. Kazakov
2007-05-24 15:00       ` Georg Bauhaus
replies disabled

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