From: Brian Rogoff <bpr@shell5.ba.best.com>
Subject: Re: Inheritance and Polymorphism in Ada !!
Date: 1999/10/18
Date: 1999-10-18T00:00:00+00:00 [thread overview]
Message-ID: <Pine.BSF.4.10.9910181813150.26957-100000@shell5.ba.best.com> (raw)
In-Reply-To: wccu2no1tzz.fsf@world.std.com
On Mon, 18 Oct 1999, Robert A Duff wrote:
> "Matthew Heaney" <matthew_heaney@acm.org> writes:
> > Yes, it's true that dynamic memory allocation isn't allowed, but Ada was
> > designed to that you don't need dynamic memory allocation.
> >
> > There was no reason for you to put the object on the heap. You could
> > have said just as easily:
> >
> > Object : Type_A'Class := Type_B'(1, 2);
> >
> > No heap required.
>
> True in this case, but I think it's fair to say that if you're doing
> OOP, you will *usually* need to put some objects in the heap. The above
> trick only works when you know the tag you want a the right time, and
> you don't want to change the tag (which you can simulate by deallocating
> and reallocating in the heap), and when you don't have heterogeneous
> data structures (eg you're not allowed to make an array of a class-wide
> type).
I agree with all of this, but I recall a few years ago that someone :-)
posted a heap using version of Ackerman's function, directly translating
a program Norman Cohen wrote using (full upward) closures. In this
particular program, a few tweaks and a bit of naughtiness allows us to
write a "heapless" version, assuming that the variable sized arrays aren't
heap allocated. I'll append this program, and refer reader's back to
the original discussion entitled "Q: access to subprogram" from Jul '96.
Note that even though naughty, this is Ada-95 with no GNAT extensions.
No you can't do this in general for OOP programs, but I confess that I
admire Matt's dedication to stackliness.
-- Brian
package body Ackermann_Computation is
package Container is
-- We need to put Ackermann_Row_Type in a package, so
-- Invoke will be primitive.
type Ackermann_Row_Type is abstract tagged limited null record;
-- Six reserved words in a row!
function Invoke(R: Ackermann_Row_Type; N: Natural)
return Natural is abstract;
-- Invokes the closure represented by R, with parameter N.
type Ackermann_Row_Ptr is access all Ackermann_Row_Type'Class;
end Container;
use Container;
type Row_Zero_Type is new Ackermann_Row_Type with null record;
function Invoke(R: Row_Zero_Type; N: Natural)
return Natural;
function Invoke(R: Row_Zero_Type; N: Natural)
return Natural is
begin
return N + 1;
end Invoke;
type Successor_Row_Type is new Ackermann_Row_Type with
record
Pred : Ackermann_Row_Ptr;
end record;
-- Pred points to the predecessor row of this row. This is analogous
-- to the parameter F in Norman's Successor_Row function.
function Invoke(R: Successor_Row_Type; N: Natural)
return Natural;
function Invoke(R: Successor_Row_Type; N: Natural)
return Natural is
Counter : Natural := N + 1;
Result : Natural := 1;
begin
while Counter /= 0 loop
Result := Invoke(R.Pred.all, Result);
Counter := Counter - 1;
end loop;
return Result;
end Invoke;
function Ackermann (M, N: Natural) return Natural is
Row_Zero : aliased Row_Zero_Type; -- R[0]
Row : array (1 .. M) of aliased Successor_Row_Type;
Row_Ptr : Ackermann_Row_Ptr := Row_Zero'Unchecked_Access;
begin
if M = 0 then
return N+1;
end if;
for I in 1 .. M loop
Row(I).Pred := Row_Ptr;
Row_Ptr := Row(I)'Unchecked_Access;
-- Compute R[1] from R[0], R[2] from R[1], ...
end loop;
return Invoke(Row(M), N); -- i.e., R[m](n)
end Ackermann;
end Ackermann_Computation;
next prev parent reply other threads:[~1999-10-18 0:00 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-10-15 0:00 Inheritance and Polymorphism in Ada !! Chango Cho
1999-10-15 0:00 ` Andreas Winckler
1999-10-15 0:00 ` Lutz Donnerhacke
1999-10-15 0:00 ` Richard D Riehle
1999-10-15 0:00 ` Matthew Heaney
1999-10-15 0:00 ` Richard D Riehle
1999-10-18 0:00 ` Robert Dewar
1999-10-23 0:00 ` Richard D Riehle
1999-10-24 0:00 ` Robert Dewar
1999-10-24 0:00 ` Brian Rogoff
1999-10-26 0:00 ` Robert Dewar
1999-10-25 0:00 ` Robert A Duff
1999-10-26 0:00 ` Robert Dewar
1999-10-26 0:00 ` Robert A Duff
1999-10-18 0:00 ` Robert A Duff
1999-10-19 0:00 ` Robert Dewar
1999-10-20 0:00 ` Robert A Duff
1999-10-21 0:00 ` Simon Wright
1999-10-21 0:00 ` Robert A Duff
1999-10-21 0:00 ` Paul Duquennoy
1999-10-21 0:00 ` Robert Dewar
1999-10-22 0:00 ` Matthew Heaney
1999-10-15 0:00 ` Stephane Barbey
1999-10-15 0:00 ` tmoran
1999-10-15 0:00 ` tmoran
1999-10-15 0:00 ` Matthew Heaney
1999-10-18 0:00 ` Robert A Duff
1999-10-18 0:00 ` Brian Rogoff [this message]
1999-10-18 0:00 ` Robert A Duff
1999-10-15 0:00 ` Lutz Donnerhacke
1999-10-15 0:00 ` Ted Dennison
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox