comp.lang.ada
 help / color / mirror / Atom feed
From: Robert A Duff <bobduff@shell01.TheWorld.com>
Subject: Re: Run-Time Type Assignment
Date: Wed, 28 Aug 2002 22:47:13 GMT
Date: 2002-08-28T22:47:13+00:00	[thread overview]
Message-ID: <wccofbmtxce.fsf@shell01.TheWorld.com> (raw)
In-Reply-To: Jf8b9.15221$zT.6491@nwrddc04.gnilink.net

"Frank J. Lhota" <NOSPAM.lhota.adarose@verizon.net> writes:

> "Robert A Duff" <bobduff@shell01.TheWorld.com> wrote in message
> news:wccn0r7hx5y.fsf@shell01.TheWorld.com...
> > Kilgallen@SpamCop.net (Larry Kilgallen) writes:
> >
> > > What is a downward closure ?
> >
> > The ability to pass a procedure as a parameter to a procedure.
> 
> <snip>
> 
> > GNAT supports downward closures via the 'Unrestricted_Access attribute,
> > but that's not Ada (unfortunately).
> 
> What about using just the plain old 'Access attribute to pass a pointer to
> the procedure as a parameter? That is supported by all Ada 95 compilers.

No, 'Access doesn't work.  Typically, the loop body (the procedure to be
passed as a parameter) is more nested than the iterator, which makes
'Access illegal.

function Count_Items(X: Container) return Natural is
    Result: Natural := 0;
    
    procedure Incr(...) is
    begin
        Result := Result + 1;
    end Incr;
begin
    Iterate(X, Incr'Access); -- Wrong!
    return Result;
end Count_Items;

That's illegal, because Incr is more nested than the access-to-procedure
type passed to the iterator (which is defined in some package
elsewhere).

Usually, the loop body (e.g. Incr) needs to be more nested so it can see
some local variables.

GNAT's 'Unrestricted_Access attribute works in this case, but it is
nonportable and dangerous.  The question was whether Pascal supports
features not supported by Ada: in this case, it does; the feature is
portable and safe (compared to 'Unrestricted_Access).  It's more
readable, too, since you can just pass the procedure, not a pointer to
it.

- Bob



  parent reply	other threads:[~2002-08-28 22:47 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-28  6:53 Run-Time Type Assignment Robert C. Leif
2002-08-28 11:04 ` Robert Dewar
2002-08-28 13:35   ` Robert A Duff
2002-08-28 14:56     ` Larry Kilgallen
2002-08-28 14:31       ` Robert A Duff
2002-08-28 14:59         ` Lutz Donnerhacke
2002-08-28 22:32           ` Robert A Duff
2002-08-29 22:55           ` Dmitry A.Kazakov
2002-08-28 18:03         ` Frank J. Lhota
2002-08-28 18:37           ` Pat Rogers
2002-08-28 22:47           ` Robert A Duff [this message]
2002-08-29 13:32             ` Ben Brosgol
2002-08-29 13:52               ` SIMON Claude
2002-08-29 14:30                 ` Robert A Duff
2002-08-29 18:27                   ` Randy Brukardt
2002-08-29 14:56               ` Robert A Duff
2002-08-30  3:04                 ` Ben Brosgol
2002-08-30 22:54                   ` Robert A Duff
2002-08-29 15:09               ` Larry Kilgallen
2002-08-29 14:29                 ` Marin D. Condic
2002-08-28 13:41 ` Robert A Duff
2002-08-28 17:15 ` Hyman Rosen
2002-08-28 20:27 ` Björn Lundin
     [not found] <002a01c24e5f$9ee347b0$789a0844@robertqgx6k4x9>
2002-08-28 11:33 ` sk
     [not found] ` <3D6CB4F5.F4E05D76@myob.com>
2002-08-28 11:37   ` sk
2002-08-28 15:39   ` Robert C. Leif
2002-08-28 18:53     ` Jeffrey Carter
2002-08-28 20:54   ` Robert C. Leif
2002-08-28 22:55     ` Robert A Duff
2002-08-29  3:18       ` Robert C. Leif
     [not found] <005101c24ea9$0de9c960$789a0844@robertqgx6k4x9>
2002-08-28 16:06 ` sk
2002-08-28 22:44   ` tmoran
2002-08-29  0:37   ` tmoran
replies disabled

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