Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: How will you use state declared variables in Perl6?

by Juerd (Abbot)
on Jul 10, 2005 at 12:19 UTC ( [id://473756]=note: print w/replies, xml ) Need Help??


in reply to How will you use state declared variables in Perl6?

So how will you use state declared variables in Perl6?

I would also use them with great caution, as I do with the Perl 5 closure equivalent. Named subs can become non-reentrant and impure. Currently, I think only caching of pure things is a good use, and for everything else, you should use some kind of instances. Since memoization will probably be available, probably not even for caching, will state be used much.

Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }

  • Comment on Re: How will you use state declared variables in Perl6?

Replies are listed 'Best First'.
Re^2: How will you use state declared variables in Perl6?
by Limbic~Region (Chancellor) on Nov 04, 2006 at 23:41 UTC
    Juerd,
    Since memoization will probably be available, probably not even for caching, will state be used much.

    I just added an example to pugs which uses state for memoization.

    use v6; my $n = @*ARGS[0] // 42; say fib($n); sub fib (Int $n) { state %seen; return 1 if $n < 2; %seen{$n - $_} //= fib($n - $_) for 1 .. 2; return %seen{$n - 1} + %seen{$n - 2}; }

    Cheers - L~R

      Hmm, why a hash? And why not optimize assuming the current value is already in @seen? Also, declarators need not be separate statements. So I'd probably write it like this:
      sub fib (Int $n) { return 1 if $n < 2; state @seen[$n] //= fib($n-1) + fib($n-2); }
      I think that may be a little clearer as well. If I wanted to golf it just a bit more I'd say:
      sub fib (Int $n) { $n < 2 or state @seen[$n] //= fib($n-1) + fib($n-2); }
      If I wanted to golf it a lot more I'd say:
      my&fib:={$_<2or state@s[$_]//=fib($_-1)+fib $_-2}

        Um. Er...?

        pugs>sub fib (Int $n) { return 1 if $n < 2; state @seen[$n] //= fib($n +-1) + fib($n-2); } Internal error while running expression: *** unexpected "[" expecting word character, "::", "=", ":=", "::=", ";" or "}" at <interactive> line 1, column 52

        Update: This works though

        pugs> sub fib (Int $n) { state @seen; return 1 if $n < 2; @seen[$n] / +/= fib($n-1) + fib($n-2); }; undef pugs> say fib 4; 5 undef pugs> say fib 8; 34 undef pugs> say fib 800; 1121023813016570197539221312040081070329432498024398917379911096096424 +176870242714672419719090010009284331740160122026805305229708722215290 +03044406006693244742562963426 undef

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

      My point was that you'd use standard memoization for that, not your own mechanism. In other words: state will (as far as I can estimate) not be used much for memoization, because it's easier to just say "is memoized" or something alike.

      Juerd # { site => 'juerd.nl', do_not_use => 'spamtrap', perl6_server => 'feather' }

        That's currently specced as "is cached" though I don't believe it's implemented yet. However, even after it's implemented, it's not going to be smart enough from the type signature to know whether an incoming parameter is sparse or dense, and for something like fibonacci an array is going to provide a faster memo cache than a hash is. Maybe the memoizing code can be smart enough to figure that out heuristically, but that's not a sure thing at this point.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://473756]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2024-04-26 04:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found