NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.
All the Perl that's Practical to Extract and Report
Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.
minor nit (Score:2)
Re: (Score:1)
You are, of course, completely correct. Moritz pointed this out as well [perlgeek.de]. Not sure why I left the boolean in anyway. Esthetics, maybe. Or perhaps just absent-mindedness. I also considered defining it as
{;}before the loop, and then running it afterwards no matter what. Saves us anifstatement.Of course, implementing Perl 6 on top of Perl 6 means I'm pretty much screwed speed-wise no matter how many micro-optimizations I find. I'm left having to optimizing for other things, such as getting all the cool phas
Name of Phasers (Score:1)
do FIRST not BEFORE (Score:1)
About implementing it, how about maintaining a loop iteration counter in some internal variable as $?I.
The same applies for LAST, but how do you know you are running the last iteration until after the loop check has failed?
Re: (Score:1)
Re: (Score:1)
Next time I have opinions about Perl6 I read the specs first.
Ka-ching! You've just earned 100 experience points, and may proceed to the next level of Perl 6. :)
Re: (Score:1)
Executing FIRST before anything in the loop makes it pretty uninteresting. It would be more useful if it were run conditionally but on its place.
...and that, to be clear, is how it's spec'd to work, and how I actually end up implementing it in the post.
The same applies for LAST, but how do you know you are running the last iteration until after the loop check has failed?
Also addressed in the blog post in whose comment thread you are commenting. :)
Re: (Score:1)
for 1..3 { say "enter"; FIRST { say "first run" } LAST { say "last run" } say "leave" }I would consider FIRST and LAST to be interesting if that code printed
enter, first run, leave, enter, leave, enter, last run, leave.Re: (Score:1)
Then what you want is probably not a phaser. Happily, the "create this exact behavior with a home-made module" option is still available as a way out.
A simple way to do what you want without any syntax modifications to the language would be to iterate over
.kvof the list, and then check the.valuepart inifstatements in the loop block.In general, it's not possible to know which iteration will become the last one until it's already finished. It is possible in your example, with a finite, statically intros
Re: (Score:1)
Re: (Score:1)
Oops. That won’t work for
LAST, though it does forFIRST. Hmm.teach for a new trick (Score:1)
The only condition you have left then would be if the list is empty. "for" has to check that anyway (at some point) so you don't really add anything.
I don't really like to have $LOOP_HAS_RUN = True; any time you call the pointy block.
I tried to implement it in javascript and ended up with the following.
window.super_f
Re: (Score:1)
Your solution works fine when the
FIRSTandLASTdoes not access any lexical variables specific to the loop block.$ain your Perl 6 code at the end is such a variable. Sending$code_firstand$code_lastin as unrelated closures doesn't give those closures access to$a.For a solution that does work for these cases, please re-read the blog post. :)