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:
Show quoted text 6 lines
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.
David Emerson wroteI'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.