From: porton@ex-code.com (Victor Porton)
Subject: Re: Composing sequences (interesting to solve)
Date: Fri, 17 Jan 2003 01:09:49 +0500
Date: 2003-01-16T20:15:59+00:00 [thread overview]
Message-ID: <3e2712ff$0$33929$bed64819@news.gradwell.net> (raw)
In-Reply-To: 3e2620ad$0$33930$bed64819@news.gradwell.net
In article <b06t4c$m4h27$3@id-77047.news.dfncis.de>,
"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
> Victor Porton wrote:
>
>> See an interesting and yet unsolved by me practical task to solve:
>>
>> I have "elements" of various kinds (Base_Element'Class):
>>
>> type Base_Element is null record;
>>
>> There are many various types of element derived from
>> Base_Element. Some of these contain accesses to other
>> elements (which I allocate by "new"), so that this forms
>> trees.
>>
>> To eliminate access types conversions I decided to limit
>> myself to use only Base_Element_Access (not accesses to
>> derived types) (BTW, Is it right design decision?):
>>
>> type Base_Element_Access is access Base_Element'Class;
>>
>> One of the types of elements is "sequence" (it is an ordered
>> container of elements):
>>
>> type Sequence is new Base_Element with private;
>>
>> I wish to produce sequences (allocated dynamically) by such
>> the syntax using overloaded function "&":
>>
>> E1 & E2 & E3
>>
>> The question is how to define function "&" so that it would
>> give the right result (access to one dynamically allocated
>> sequence) independingly on the number of elements?
>
> I think you should clarify whether A & B creates a new object or just binds
> A and B. Why an access type have to be returned? It is a bad style and
> error prone. If you really want heap allocated objects [with reference
> counting and garbage collection], use handles instead of raw pointers. &
> have to be defined on both handles and privately, on the objects. It is a
> bit nasty especially if you want to add some operations to derived
> elements. If so you have two [bad] alternatives:
I don't understand your question, A & B should create (on heap) object of
type Sequence which contains accesses to A.all and B.all . A & B & C
should create Sequence of three elements etc.
Consider:
type Pair is new Base_Element with
record
First, Second: Base_Element_Access;
end record;
The constructor would be just:
function Make_Pair(First, Second: Base_Element_Access)
return Base_Element_Access is
begin
return new Pair'(Base_Element with First=>First, Second=>Second);
end;
But if I use types themselves, I need:
function Make_Pair(First, Second: Base_Element'Class)
return Base_Element_Access is
begin
return new Pair'(Base_Element with
First =>new Base_Element'Class'(First),
Second=>new Base_Element'Class'(Second));
end;
-- Requires two copying of probably big objects First and Second
In fact I allocate these elements once at program's (or a
subrountine's) lifetime (as these are in fact a part of algorithm,
being something like a programming language interpretor, not just
a typical data) and then are going to deallocate all of them at
once by using scopes, not explicit deallocation. You see that I
don't need reference counting and garbage collection. So I see no
need for handles.
Do you now consider it a good style or have an idea how to make it
better? Do you still think that introducing handles would be useful?
At least I think that reference counting is a bloating for me.
> 1. Compile-time checkable. Derive new handle types and define new operations
> on them.
>
> 2. Run-time checkable. Define new operations on the handle type and leave
> checks to casting.
The interest case is to make it compile time checkable. (Creating
runtime check of 'Tag attrs is trivial.)
You haven't given me a solution. (I suspect that it is even impossible
in Ada9X.)
next prev parent reply other threads:[~2003-01-16 20:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-01-16 3:01 Composing sequences (interesting to solve) Victor Porton
2003-01-16 18:20 ` Dmitry A. Kazakov
2003-01-16 20:09 ` Victor Porton [this message]
2003-01-17 8:27 ` Fraser Wilson
2003-01-17 16:27 ` Dmitry A. Kazakov
2003-01-17 20:45 ` Victor Porton
2003-01-17 21:04 ` Victor Porton
2003-01-18 12:31 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox