On Mon, Dec 09, 2002 at 02:20:01PM -0800, Austin Hastings wrote: > > --- Paul Johnson <[EMAIL PROTECTED]> wrote: > > On Mon, Dec 09, 2002 at 01:58:11PM -0800, Austin Hastings wrote: > > > Ahh. This is better. How does one implement a more sophisticated > > > cache management strategy? > > > > > > That is, what is the mechanism for manipulating the run-time system > > > behavior of subs? > > > > How about the same way as one would do it now? Presumably we won't > > all > > forget how to program when Perl 6 comes out. > > Paul, > > I think you've missed the point. The original poster (Smylers) asked if > there was a benefit to only cacheing certain values, presuming the > remainder would be either trivial to compute or internally cached, or > both. > > The suggestion was that a more advanced cache management strategy could > be attached, presumably changing the behavior of the > function-return-caching subsystem. > > I'm all in favor of that, but it's a new rock to turn over looking for > details. > > If you're proposing that the right answer is to not cache the function, > but rather implement an internal cache, then cool - you've got a friend > in Smylersvania. > > But if not, then presumably you know something I do not know: enlighten > me, please?
What I'm suggesting is that instead of: sub days_in_month(Str $month, Int $year) { $month = lc $month; if $month eq 'feb' { # Do 'complicated' calculation and cache the result for later use: my $leap = $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0); cache_and_return $leap ? 29 : 28; } else { # Simple look-up, so caching would be counter-productive: return %days{$month}; # %days was declared above (honest) } } We get: sub days_in_month(Str $month, Int $year) { $month = lc $month; if $month eq 'feb' { # Do 'complicated' calculation and cache the result for later use: my %leap_cache is static; # or something ... my $leap = $leap_cache{$year} //= $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0); return $leap ? 29 : 28; } else { # Simple look-up, so caching would be counter-productive: return %days{$month}; # %days was declared above (honest) } } OK, the cache isn't identical, but it could be programmed to be identical, or it could be better by caching lc $month rather than $month. That way I can use constructs I already (will) know and do the caching just how I want. Of course, I can do this anyway, and maybe there are benefits to having a partial caching system built into the language, but I don't see it at the moment. -- Paul Johnson - [EMAIL PROTECTED] http://www.pjcj.net