Andrew Pimlott wrote:
>
> Dave Rolsky wrote:
> > Actually, this doesn't encourage it and we
> > _still_ need iterate() for sure. We can have
> > set_map() only be used to create a new set, and
> > iterate() only be used to alter the current set
> > in place.
>
> To clarify, do you mean that iterate can be used
> to alter the current set in place because you can
> modify $_[0], or because the return value
> of the callback will replace the current element
> in the set? Ie, does
>
> $set->iterate( sub { $_[0]->clone->add( days
=> 1 ) } );
>
> alter $set? I think you intend that it would not
> (in fact, it would have no effect at all), which
> is what I would choose. After all, you
> might want to iterate through the set without
> modifying anything:
>
> $set->iterate( sub { print $_[0]->hms, "\n" } );
>
This will not work. In infinite sets, the 'iterate'
subroutine is _stored_ into the object - it is not
executed immediately.
Printing would be done with 'iterator':
$iter = $set1->iterator;
while ( $dt = $iter->next ) {
print $dt->ymd;
};
Having both 'iterate' and 'iterator' may be
confusing. Maybe 'iterate' needs a new name.
> If this is what you mean, then I think that having
> both ->iterate and ->set_map (as well as possibly
> ->set_grep) makes perfect sense.
>
> You might argue that the last example is better
> done with
>
> foreach ($set->as_list) { ... }
>
> which is a legitimate alternative. I guess my
> main point is that ->iterate doesn't sound like it
> should modify the set (again, unless you
> modify $_[0]). And since modification of $_[0] is
> always available, I think it is better not to
> update the set using the return value of the
> callback.
How about:
$set2 = $set1->set_map( sub { return $_[0] + $x } );
$det1->set_map_inplace( $_[0]->add( $x ) );
$set2 = $set1->set_grep( sub { $_[0] > $x } );
(set_grep_inplace too?)
- Flavio S. Glock