Jonadab the Unsightly One writes:
> Rod Adams <[EMAIL PROTECTED]> writes:
>
> > One solution I see to this would be to have a "lazy return" of some
> > kind, where you can send out what results you have so far, but not
> > commit that your execution is over and still allow further results to
> > be posted. For lack of better word coming to mind, I'll call a "lazy
> > return" C<emit>.
> >
> > Example above becomes:
> >
> > sub MediansBy5 ([EMAIL PROTECTED]) {
> > while @list.length >= 5 {
> > emit (sort @list.splice(0,5))[2];
> > }}
That's actually a very good idea. That's why Perl 6 has it :-)
sub MediansBy5 ([EMAIL PROTECTED]) {
gather {
while @list >= 5 { # there's no .length; it's .elems
take (sort @list.splice(0,5))[2];
}
}
C<gather> returns a list of everything that was C<take>n inside of it.
It does this by building a coroutine out of its argument, so it works
lazily.
Luke