[fpc-pascal] assigning a local function to a var

Lourival Mendes mendes.lourival at gmail.com
Fri Jul 11 00:50:07 CEST 2008


Dear David,

   Sorry for my question, probably I didn't get the real idea of what
you need, but I didn't see why the revised version didn't work.

   Actually, I would write it like:

procedure test;
  var
     what_to_say : ansistring;

  procedure proc_a;
     begin
        writeln ('A says, "', what_to_say, '"');
     end;

  procedure proc_b;
     begin
        writeln ('B says, "', what_to_say, '"');
     end;

  var
//     my_proc : procedure;   // need to specify "local". impossible?
     my_proc : TProcedure;   // Lourival

  begin
     what_to_say := 'hello, world!';

     // Lourival Begin
     my_proc:= nil;

     if not Assigned(my_proc) then begin
        my_proc:= TProcedure(@proc_a);
        my_proc ();
     end
     else .....

     // Lourival End

  end;


     Again I didn't test it, but I think that should work, shouldn't??

Lourival

2008/7/10, David Emerson <dle3ab at angelbase.com>:
> Thanks Lourival, Joao, Chris, for your responses.
>
> It looks like what I'm attempting is not possible. FWIW, I've included a
> more illustrative example at the end of this message.
>
> Thus, I would ask of the devs, has this functionality been considered?
> Is there some particular reason that anyone is opposed to implementing
> it? Or is it just difficult to implement, and/or not considered useful?
>
> There is a part of me that wants to jump in and try to implement this in
> the compiler, although I suspect I would be in well over my head.
> Before I consider making such an attempt (or looking for someone to do
> it) it'd be nice to get a feeling for whether such an extension would
> be welcome.
>
> I am hard-pressed to detect any drawback or conflict, although of course
> that's largely because I have no idea how this stuff is actually
> implemented.
>
>
> Lourival wrote some code which included:
> >   var
> >      my_func : TProcedure;
> >   begin
> >      my_func:= TProcedure(@func_a);
> >      my_func('hello, ');
> >   end
>
> Lourival: while your suggestion to typecast the local function to
> TProcedure did compile and run, the procedure is no longer "local"!
> Thus the parent function's variables are no longer in scope, which was
> the principal reason to use a local function. I neglected to include
> that in my original example, so I rewrote the example below.
>
>
> Chris: It seems like you're saying what I want to do is impossible.
> Thanks for pointing out that citation in the reference manual. It would
> be nice to hear a more definitive answer, though :) For now, I've made
> the functions external, which unfortunately requires passing many
> (local) parameters to them, within a loop that should go fast. :(
>
> Chris wrote, among other things:
> > This is for a reason - think what would happen if you were able to
> > assign a local procedure to a global variable!
>
> Perhaps my subject line should have read "assigning a local function to
> a LOCAL var" -- that is, after all, what I'm after. ((Just because it's
> possible to do something stupid with a feature, doesn't mean the
> feature is a bad idea: I can think of all sorts of stupid/absurd things
> to do with pointers, which compile without hint or warning.))
>
>
> Joao: creating a named type isn't a solution, as it only moves the
> problem of declaration into the "type" section, where the very same
> problem persists. Thanks for responding, though.
>
>
> On Wednesday 09 July 2008 9:31 am, David Emerson wrote:
> > I'd like to store an address of a local function in a variable, and
> > call that local function, but I don't know how to define a variable of
> > type "local function".
>
> Here's a revised version that better illustrates the need:
>
> test.pas(20,14) Error: Incompatible types:
> got "<address of local procedure;Register>"
> expected "<procedure variable type of procedure;Register>"
>
> procedure test;
>   var
>      what_to_say : ansistring;
>
>   procedure proc_a;
>      begin
>         writeln ('A says, "', what_to_say, '"');
>      end;
>
>   procedure proc_b;
>      begin
>         writeln ('B says, "', what_to_say, '"');
>      end;
>
>   var
>      my_proc : procedure;   // need to specify "local". impossible?
>   begin
>      what_to_say := 'hello, world!';
>      my_proc := @proc_a;   // won't compile! proc_a is local.
>      my_proc();
>   end;
>
>
> Cheers,
> ~David.
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>


-- 
Lourival J. Mendes Neto



More information about the fpc-pascal mailing list