[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