> But, as Luke pointed out, some of the other syntax required to make > that work is isn't particularly friendly: > > coro pre_traverse(%data) { > yield %data{ value }; > yield $_ for <&_.clone(%data{ left })>; > yield $_ for <&_.clone(%data{ right })>; > } > > If I work backwards, the syntax I'd _want_ for something like that > would be much like Luke proposed: > > sub pre_traverse(%data) is coroutine { > yield %data{ value }; > pre_traverse( %data{ left } ); > pre_traverse( %data{ right } ); > } > > ... where the internal pre_traverses are yielding the _original_ > pre_traverse. Whoa, though, that doesn't really work, because you'd > have to implicitly do the clone, which screws up the normal iterator > case! And I don't immediately know how to have a syntax do the right > thing in _both_ cases. > > So, if I have to choose between the two, I think I'd rather iteration > be easy than recursion be easy. If lines like > > yield $_ for <&_.clone(%data{ left })>; > > are too scary, we might be able to make a keyword that does that, like: > > sub pre_traverse(%data) is coroutine { > yield %data{ value }; > delegate pre_traverse( %data{ left } ); > delegate pre_traverse( %data{ right } ); > } > > Maybe. But in truth, that seems no more intuitive than the first.
Well, at least it's not using all those fancy features that will scare off non-gurus. But I think that instead of something declared coro I<returning> a coroutine iterator, why not just make it one (which I believe was Damian's original intent)? for <&foo> {...} A subroutine could gladly return one of these iterators in place of a different kind of iterator (or iterable structure). The problems come when passing arguments to it. For that, you can use a coroutine factory, or you can do it this way: for < coro { foo($a, $b) } > {...} We might need some shorthand for that... but probably not. This is interesting: my $coro = coro { foo($a, $b) }; $coro(); Calls foo($a, $b) without becoming a coroutine. I don't know whether this is useful or just strangely counter-intuitive. Luke