On Sat, Mar 15, 2003 at 12:19:18PM -0500, Uri Guttman wrote:
> >>>>> "AP" == Andrew Pimlott <[EMAIL PROTECTED]> writes:
>
> AP> On Fri, Mar 14, 2003 at 09:59:42PM -0500, Uri Guttman wrote:
> >>
> >> my $c;
> >> sub foo() {
> >> my $a;
> >> my $b;
> >>
> >> my sub bar() {
> >> $b = $a + $c;
> >> }
> >>
> >> bar();
> >> }
> >>
> >> is that close enough?
>
> AP> I think it's absolutely fine, assuming that &bar is a real closure
> AP> that can be returned or passed to other functions. I think nested
> AP> subs should default to "my", since there's no other point in using
> AP> them, but if Larry likes the "my", it can stay.
>
> i don't see why you would want to return a named closure when you can
> return an anon one.
Well, why not? What if I want to call it and return/pass it? I
guess that's not all that common, though.
> the implication (to me) of a named one is that it
> can be called inside foo() directly and it has access to foo() variables
> on the stack. those vars are not copied to a private pad for bar() like
> a anon closure would do. they are different animals IMO.
Suppose I do return/pass it, what will it do? It has to have some
behavior, and the only alternatives I see to closure are utterly
confusing and error-prone. If perl6diag contains the text "will not
stay shared", I will be quite sad.
The very idea of "two kinds of closure" seems confusing.
If you are worried about efficiency, there is a simple optimization:
If no reference is ever taken to the named lexical sub, it doesn't
need it's own copy of the pad.
> AP> ... well, just to be sure, here are a couple test cases:
>
> AP> my foo() {
> AP> my sub helper1() { ... helper2() ... $a ...}
> AP> my sub helper2() { ... helper1() ... $a ...}
> AP> my $a;
> AP> helper1();
> AP> }
>
> AP> helper1 and helper2 should be mutually recursive and enclose $a, ie
> AP> when compiling helper1 it shouldn't bind helper2() and $a to
> AP> whatever's in the outer/global scope.
>
> you don't return a sub there rather you made a call to it. so it is not
> the same as p5 closures. that should work fine but it doesn't need pads
> and local copies of $a in helper1/2().
ok.
> also that can be done with a plain block surrounding two subs. no need for
> nesting subs there. show me a case where you need named nesting subs and
> you return one of them to the outside.
>
> AP> my foo() {
> AP> ... helper() ...
> AP> my $a;
> AP> my sub helper { ... $a ... }
> AP> }
>
> AP> The call to helper() should work and $a should be enclosed (of
> AP> course, it will be undef when helper() is called, but helper can set
> AP> it). It's often nice to put the helpers at the end--and note that
> AP> this cannot be achieved with the Perl 5 glob trick.
>
> this is a compiler issue as to whether it can handle foward
> references. if you declared helper with a signature first (of course
> inside foo()), it would work for sure. i am not sure otherwise.
Right. I just think that since Perl can normally handle forward
references, it should be able to do so in this case.
> my point is that nested named subs are supported but they are not the
> same as anon closures returned from an outer sub. but who knows what
> larry would want there. i will ask on p6l.
Thanks.
Andrew
_______________________________________________
Boston-pm mailing list
[EMAIL PROTECTED]
http://mail.pm.org/mailman/listinfo/boston-pm