> More questions regarding the new 'given when' construct. More answers (modulo Larry :-) > 1) Is a 'when' clause required? Is it: > > [ LABEL: ] given ( expr_1 ) { > when expr_2 : block > [ when expr_3 : block ...] > expr_n [;] > } > > or > > [ LABEL: ] given ( expr_1 ) { > [ when expr_2 : block ...] > expr_n [;] > } Not required. It's: [ LABEL: ] given ( expr_1 ) { [statement ; ...] [statement] } A C<when> statement is just a particular kind of statement. > 2) In expressions 2 through n-1 - the equivalent to 'case' - you > may refer to the return value of expression 1 with $^_. Does > this imply that expression 1 will always (and only) be evaluated > in scalar context? If not, can you mix contexts across 'when' > clauses? Is the value of $^_ then a reference to the return > value? The C<given> expression is evaluated in scalar context. > 3) Can you refer to $^_ within expression n - the equivalent to 'default:'? > given ( a() ) { > print $^_; # No when clause? See #1 > } $^_ isn't an alias for the C<given>'s expression. It's a higher-order function placeholder (see: http://www.yetanother.org/damian/Perl5+i/higherorder.html) So the answer is "no". > 4) Can you refer to $^_ within the code blocks of each 'when' clause? > given ( a() ) { > when $^_ == 1 : { foo($^_) } > when $^_ == 2 : { bar( 5 + $^_ ) } > when $^_ == 3 : { ++$^_ and print $^_ } # Mutable? See #5 > } No. See the previous answer. If the gvien value is needed within the block, the most likely mechanism would be: given ( my $a = a() ) { when $^_ == 1 : { foo($a) } when $^_ == 2 : { bar( 5 + $a ) } when $^_ == 3 : { ++$a and print $a } # Mutable? See #5 } > 5) Is $^_ an alias, reference (See #2), or a copy of the return value of > expression 1, and is it mutable? Does it have the appropriate magic and > overloading capabilities? None of the above. See above. > 6) How many times is expression 1 evaluated? Once. > $a = 0; > given ( ++$a ) { > when $^_ > 5 : { #foo } > when $^_ > 4 : { #bar } > when $^_ > 3 : { #baz } > #foobar > } > > I would expect that $a would equal '1' after #foobar executed. But if > multiple contexts are allowed (see question 2), how would N/A. > 7) The 'when' blocks are not fall-through, a la C's switch statement. You > can obtain a similar result by invoking 'next' within the 'when' block. > > Is this regardless of whether expr2 would have also evaluted true? (IOW, > does it truly jump to the next block?) If not, does it jump to the > expression after that (if it exists) and try again, or does it default > expression (since the original next expression evaluated false)? A C<next> within a C<when>'s block causes control to jump to the next statement in the innermost surrounding <given>'s block. If that is a C<when> statement, the C<when> test is then evaluated as normal. > 8) Is the order of evaluation guaranteed? (I assume so, but just thought > I'd check.) I certainly hope so! ;-) > 9) It has a lexical construct similar to a conditional block, so that > lexical variables declared in the 'given' expression are within the inner > scope, correct? Correct. > 10) I've already asked Damian this question on the side, but I'll > repeat (and expand) it here, to give me an even ten. Should it > be a single default expression, multiple default expressions, > or a default block? Any of the above. A C<given> block is just a block. A C<when> statement is just a statement. You can put any statement inside any block, so you can put both C<when> and non-C<when> statements inside a C<given> (in any sequence and multiplicity you like). DamianThread Previous | Thread Next