comp.lang.ada
 help / color / mirror / Atom feed
From: Brian Drummond <brian@shapes.demon.co.uk>
Subject: Re: Proposal: Auto-allocation of Indefinite Objects
Date: Tue, 28 Jul 2020 14:28:53 -0000 (UTC)	[thread overview]
Message-ID: <rfpcn4$2n6$1@dont-email.me> (raw)
In-Reply-To: rfnbtg$t1c$1@gioia.aioe.org

On Mon, 27 Jul 2020 22:02:57 +0200, Dmitry A. Kazakov wrote:

> On 27/07/2020 19:48, Brian Drummond wrote:
> 
>> 2) can be implemented internally using pointers, but externally appears
>> to be a data object, just like Unbounded_String does, with similar
>> semantics.
> 
> No, the point is that Unbounded_String is exactly opposite to what is
> required. In no case it should appear as an object of a different type!
> 
> Compare access to string P with unbounded string U:
> 
>     for I in P'Range loop -- This is OK 
>        P(J) := 'a' -- This is OK
> 
> Now would you do:
> 
>     To_String (U) (J) := 'a' -- Garbage!

That wasn't the aspect of Unbounded I was getting at. I agree ... garbage.

What I meant was that Unbounded doesn't load New, dereferencing, 
deallocation etc onto the programmer, but hides the access details, and 
our indefinite type should do the same (the compiler can probably to a 
better job than the programmer anyway).

I'm suggesting something more like the C++ reference, signalling (perhaps 
by adding a reserved word "indefinite") that fixed size allocation won't 
work; and implementation is more in line with a controlled type but with 
system-provided Initialise,Adjust,Finalize providing the required 
operations (no need for the programmer to provide them).

A : String := "hello" -- a definite string
P : access String := new String'("hello");
Q : indefinite String := "hello";

... 
   begin
     for I in P'Range loop -- This is OK 
        P(J) := 'a'; -- This is OK
        Q(J) := 'a'; -- also OK. But index out of range would raise 
Constraint Error
...
     Q := "hello_world"; -- deallocates, allocates with new bounds
...
   end;    -- deallocate Q here.

It follows that "indefinite" cannot also be "aliased" unless we want to 
implement smart pointers. For simplicity I'd suggest disallowing "aliased 
indefinite" on the grounds that "access" can (should) be used instead.

Records (including tagged, class wide, discriminated) should work the 
same, but probably with shallow copy on assignment if they contain access 
types.

If there is no re-allocation (no different size assignment) the compiler 
is free to substitute direct (stack) storage instead of heap allocation 
and implicit access types. So for example instead of
   
   A constant String := "done";
 ...
   loop
      declare
         P : String := Get_Line;
      begin
         exit when P = A;
      end;
   end loop;

   A constant String := "done";
   Q : indefinite String;
 ...
   loop
      Q := Get_Line;
      exit when Q = A;
   end loop;

the implementation can be either an implicit declare block or an implicit 
access type. However, where Q has several reassignments within a block, 
and the compiler can't determine the size, an implicit access type must 
be used. (If it can, it can warn that "indefinite " is unnecessary).

> What if the original object must be a class-wide object, task, protected
> object, limited object etc?
> 
> Ada's access types delegate all operations to the target object, except
> assignment. This is the key property that the proposal in my view must
> retain.

Indefinite can also be applied to records (discriminated, class wide, etc) 
here the size is indeterminate and may vary on reassignment. Assignment 
would always be shallow copy (where the record contained access types).

-- Brian

  reply	other threads:[~2020-07-28 14:28 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-03 22:48 Proposal: Auto-allocation of Indefinite Objects Stephen Davies
2020-04-03 23:45 ` Stephen Leake
2020-04-04 10:54   ` Jeffrey R. Carter
2020-04-04 20:55     ` Stephen Davies
2020-04-04  8:31 ` Dmitry A. Kazakov
2020-07-27  7:47 ` Yannick Moy
2020-07-27  9:21   ` J-P. Rosen
2020-07-27  9:49     ` Dmitry A. Kazakov
2020-07-27 17:48   ` Brian Drummond
2020-07-27 20:02     ` Dmitry A. Kazakov
2020-07-28 14:28       ` Brian Drummond [this message]
2020-07-28 14:59         ` Dmitry A. Kazakov
2020-07-29 15:33           ` Brian Drummond
2020-07-29 16:20             ` Dmitry A. Kazakov
2020-07-30 13:37               ` Stephen Davies
2020-07-30 14:23                 ` Dmitry A. Kazakov
2020-07-30 17:04               ` Brian Drummond
2020-07-30 18:28                 ` Dmitry A. Kazakov
2020-08-10  0:39                   ` Randy Brukardt
2020-08-10  8:57                     ` Dmitry A. Kazakov
2020-08-20  0:10                       ` Randy Brukardt
2020-08-20 17:49                         ` Dmitry A. Kazakov
2020-08-20 20:19                           ` Dennis Lee Bieber
2020-08-20 23:33                             ` Randy Brukardt
2020-08-21  6:45                               ` Dmitry A. Kazakov
2020-08-23  4:52                                 ` Randy Brukardt
2020-08-23 12:28                                   ` Dmitry A. Kazakov
2020-08-20 23:30                           ` Randy Brukardt
2020-08-21  6:46                             ` Dmitry A. Kazakov
2020-08-23  4:48                               ` Randy Brukardt
2020-08-23 12:29                                 ` Dmitry A. Kazakov
2020-08-10  0:31               ` Randy Brukardt
2020-08-10  8:58                 ` Dmitry A. Kazakov
2020-08-20  0:13                   ` Randy Brukardt
2020-08-20 17:49                     ` Dmitry A. Kazakov
2020-08-20 23:25                       ` Randy Brukardt
2020-08-21  7:08                         ` Dmitry A. Kazakov
2020-08-23  5:03                           ` Randy Brukardt
2020-08-23 12:28                             ` Dmitry A. Kazakov
2020-07-27 20:31     ` Jeffrey R. Carter
2020-07-31  9:25 ` Stephen Davies
2020-07-31 10:20   ` Dmitry A. Kazakov
2020-08-01 11:22     ` Stephen Davies
2020-08-01 12:58       ` Dmitry A. Kazakov
2020-08-01 20:35         ` Stephen Davies
2020-08-01 20:56           ` Dmitry A. Kazakov
2020-09-03  4:30 ` linda white
replies disabled

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