comp.lang.ada
 help / color / mirror / Atom feed
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



  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