in reply to A metaclosure? Howto?

Well, maybe ive completely missed the point but implementing a subroutine that keeps its state just seems to be a more complex way of saying that you need static variables. And adding static variables to a subroutine is easy. Just put the subroutine inside an anonymous block, along with lexical declarations for the vars you need to be static and away you go...
#normal sub sub foo { return join ("#",@_); } { #Anon block for static vars to live in. my $join="-"; sub bar { my $ret=join($join,@_); $join=($join eq "-") ? ":" : "-"; return $ret; } } # End static block print foo(1..10),"\n"; print foo(1..10),"\n"; print bar(1..10),"\n"; print bar(1..10),"\n"; print bar(1..10),"\n"; __END__ 1#2#3#4#5#6#7#8#9#10 1#2#3#4#5#6#7#8#9#10 1-2-3-4-5-6-7-8-9-10 1:2:3:4:5:6:7:8:9:10 1-2-3-4-5-6-7-8-9-10
Hope thats what you needed...

:-)

PS: If memory serves me right I believe that the anon block should become a BEGIN block under some circumstances (mod_perl maybe?). I seem to recall something by tye on the matter but I dont recall the details, and I cant find the post in question.

Yves / DeMerphq
---
Writing a good benchmark isnt as easy as it might look.

Replies are listed 'Best First'.
(tye)Re: A metaclosure? (use static vars)
by tye (Sage) on May 13, 2002 at 16:59 UTC

    There are lots of cases where the BEGIN fixes problems. mod_perl is one. Several others boil down to variations on this problem:

    #!/usr/bin/perl -w use strict; print "Starts out false: ", boolToggle(), $/; print "Then is true: ", boolToggle(), $/; print "Then false: ", boolToggle(), $/; print "Then true: ", boolToggle(), $/; # BEGIN # Remove first "#" from this line to fix bug. { my $static= 1; sub boolToggle { $static= $static ? 0 : 1; return $static; } } print "Then opposite of last time: ", boolToggle(), $/;
    which produces:
    Starts out false: 1 Then is true: 0 Then false: 1 Then true: 0 Then opposite of last time: 0
    Trying to topologically sort your subroutine declarations to avoid this problem is probably not a good solution.

            - tye (but my friends call me "Tye")