Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

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

by Limbic~Region (Chancellor)
on Nov 04, 2006 at 23:41 UTC ( #582273=note: print w/ replies, xml ) Need Help??


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

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


Comment on Re^2: How will you use state declared variables in Perl6?
Download Code
Re^3: How will you use state declared variables in Perl6?
by TimToady (Parson) on Nov 05, 2006 at 05:15 UTC
    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.
        You must be running an older pugs. In fact, the current (working) version in the pugs repository (r14657) now reads:
        sub fib (UInt $n) { (state $seen = [0,1,1]).[$n] //= fib($n-1) + fib($n-2); }
        It would also work as state @seen = 0,1,1 except there's a bug with initializing state variables using a list that causes it to reinitialize every time instead of just the first time, which, while it lets it run, kinda defeats the memoization...
Re^3: How will you use state declared variables in Perl6?
by Juerd (Abbot) on Nov 05, 2006 at 23:50 UTC

    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.

        I have to admit that I'm dreaming of a code profiler that also tries some optimization strategies, and picks the best for your program. Memoization is already heavily parametrized, and I expect the same things to be possible with "is cached". Perhaps "use a dense array" can be communicated in an argument passed to "is cached"?

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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2014-07-13 08:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (248 votes), past polls