From: Dmitry A. Kazakov <mailbox@dmitry-kazakov.de>
Subject: Re: Problem With Self-Referential Access-to-Subprogram Type
Date: Wed, 05 Nov 2003 14:33:12 +0100
Date: 2003-11-05T14:33:12+01:00 [thread overview]
Message-ID: <j7shqvoaubg7jstuh4qak8t30p1qvrqvil@4ax.com> (raw)
In-Reply-To: mailman.278.1068031675.25614.comp.lang.ada@ada-france.org
On Wed, 05 Nov 2003 11:27:22 +0000, Marius Amado Alves
<amado.alves@netcabo.pt> wrote:
>On Wed, 2003-11-05 at 08:31, Dmitry A.Kazakov wrote:
>> >> Yes, there is a difference. Technically, for an out parameter the
>> >> compiler should still know the object constraints.
>
>> >Only at runtime. Consider Ada.Text_IO.Get (Item : out String). What
>> >constraints is the compiler knowing here?
>
>> It knows that there are bounds which cannot be changed. If Item were
>> of String (1..5) the compiler would probably choose another way of
>> parameter passing than for String (<>) with the consequence that the
>> stack frame would be different.
>
>Irrelevant. This applies to return types just as well.
They are "bad" anyway. A return value is potentially a newly allocated
object. An out parameter is not (copy out does not count). So a
difference does exist.
BTW, there is an AI for returning / initializing limited type objects.
Let's see (:-))
>The original poster has a very good question--which has found no real
>answer yet. My guess is it comes down to the hardware-orientedness of
>Ada.
C++ is also hardware-oriented, but solves this other way, which I do
not like much.
Returning to Ada let's compare:
type Mysterious;
function Create return Mysterious;
Init : constant Mysterious; -- Illegal
procedure Baz (X : Mysterious := Init); -- Illegal
procedure Bar (X : Mysterious := 0); -- Illegal, Ada is not C++!
procedure Foo (X : Mysterious := Create); -- Illegal
...
type Mysterious is new Integer;
Init : constant Mysterious := 0;
with
type Mysterious is private;
function Create return Mysterious;
Init : constant Mysterious;
procedure Bar (X : Mysterious := Create);
procedure Bar (X : Mysterious := 0); -- Still illegal
procedure Foo (X : Mysterious := Init);
...
private
type Mysterious is new Integer;
Init : constant Mysterious := 0;
Private types are much more prematurely usable! (:-))
BTW there is a more serious problem than premature use. That is an
inability to hide the parameter defaults of a subroutine if the type
has to be private. You have to expose Init and Create, even if their
direct use is undesirable.
> I was surprised the *first* form compiled.
Well, now the language lawyers have to say ... (:-))
---
Regards,
Dmitry Kazakov
www.dmitry-kazakov.de
next prev parent reply other threads:[~2003-11-05 13:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-11-03 16:58 Problem With Self-Referential Access-to-Subprogram Type Tad Ashlock
2003-11-04 10:04 ` Dmitry A. Kazakov
2003-11-04 13:52 ` Tad Ashlock
2003-11-04 14:24 ` Dmitry A. Kazakov
2003-11-04 14:52 ` Marius Amado Alves
2003-11-05 8:31 ` Dmitry A. Kazakov
2003-11-05 11:27 ` Marius Amado Alves
2003-11-05 13:33 ` Dmitry A. Kazakov [this message]
2003-11-05 14:02 ` Marius Amado Alves
2003-11-05 17:49 ` Adam Beneschan
2003-11-05 18:55 ` Marius Amado Alves
2003-11-05 22:54 ` Tad Ashlock
2003-11-06 17:45 ` Warren W. Gay VE3WWG
-- strict thread matches above, loose matches on Subject: below --
2003-11-03 17:32 amado.alves
2003-11-04 14:02 ` Tad Ashlock
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox