From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Date: 5 May 93 16:30:56 GMT From: cis.ohio-state.edu!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!us enet.ins.cwru.edu!agate!netsys!pagesat!news.cerf.net!shrike.irvine.com!adam@ucb vax.Berkeley.EDU (Adam Beneschan) Subject: Re: Passing procedures as parameters to procedures. Message-ID: List-Id: In article <1993May4.221355.13487@evb.com> jgg@evb.com (John Goodsen) writes: > In article <1993May3.190746.1043@ee.ubc.ca> luisl@ee.ubc.ca > (luis linares-rojas) writes: > >Subject: Procedures/functions as parameters to procedures/functions. > >Before commiting myself to any long term commitment with the Ada > >language, I've been revising its capabilities. There is > >something that I have not found so far: how to pass a procedure > >(or a function) as a parameter to another procedure (or > >function). Or, in the same spirit, how to create an array of > >procedures. The question is: is there a way of doing this in > >Ada, and (if so) how? I'd appreciate any help. > > If you can't wait for Ada 9X and you need dynamic binding of > the procedure to call, then you might also check out how it's > currently done in the Xt/Motif bindings which support call by > address of Ada procedures from C. Basically, you > pass the address of an Ada procedure to an external routine > using the 'ADDRESS attribute and have that routine call the Ada routine > that was passed to it. Of course, this has the usual side effects > of being compiler dependent, etc... but it works in Ada 83. If you do this, be aware that you may not be able to do this for nested procedures. In our compiler, and probably in other Ada compilers, nested procedures take "hidden" parameters, e.g.: procedure A (x : integer) is local_variable : integer; procedure B (y : integer) is begin ... end B; begin ... end A; The code for B actually takes two parameters; the extra parameter is a frame pointer that allows B to access local variables defined in A (such as local_variable). So if you pass B'ADDRESS to a C or assembly-language routine that tries to call B, you will not get the desired results. -- Adam