Sweet!  David, does that solve your gripe?

On Jul 1, 2009, at 11:19 AM, Doug Hunt wrote:

> Hi Craig:  The // operator exists in perl 5.10.  Its quite nice,  
> I've been using it.
>
> Regards,
>
>  Doug
>
> [email protected]
> Software Engineer
> UCAR - COSMIC, Tel. (303) 497-2611
>
> On Wed, 1 Jul 2009, Craig DeForest wrote:
>
>> The problem with the Perl logicals is that, being short-circuiting
>> operators (which explicitly don't evaluate their second argument if
>> that argument can't affect the outcome), they don't have  
>> deterministic
>> behavior in a threaded expression.  The bitwise Booleans work well as
>> non-short-circuiting operators, provided only that you ensure your
>> values are logical and not just arbitrary numbers.
>>
>> In your case
>>
>>      my $t = $opts{t} or sequence( $data->dim(0) );
>>
>> I think that what you really want is the perl-6 operator '//':
>>
>>      my $t = $opts{t} // sequence( $data->dim(0) );
>>
>> which acts on the definedness, rather than truth, of the left-hand
>> argument.  It would indeed be very nice to have that particular
>> shorthand in Perl 5.
>>
>> The current status quo (of barfing out when a multi-element PDL gets
>> evaluated in boolean context) is surprising but at least it avoids  
>> the
>> (different) hosts of tricky bugs and surprising cases that turn up
>> when any of the main alternatives (non-short-circuiting operation,  
>> all/
>> any collapse, or nonnullness) are considered.
>>
>> Cheers,
>> Craig
>>
>>
>> On Jul 1, 2009, at 9:26 AM, David Mertens wrote:
>>
>>> It says in the FAQ (question 6.11) that logical operators simply
>>> don't work.  Why?
>>>
>>> As is somewhat common practice, I have set up some of my scripts to
>>> get user info through a hash, which allows for nicely compact ways
>>> of setting variable defaults, like:
>>>
>>> my $yLabel = ( $opts{yLabel} or 'Amplitude');
>>>
>>> However, since logical operators are not allowed with piddles, I
>>> can't do something like this:
>>>
>>> my $t = ( $opts{t} or sequence( $data->dim(0) ) );
>>>
>>> I argue that this breaks precedence with how Perl handles this sort
>>> of expression.  I think that any nonempty piddle should return
>>> 'true', just as any nonempty list returns 'true' (since nonempty
>>> lists return their length in scalar contexts).  This way, you can
>>> still set up more elaborate checks on user passed data if you want
>>> to allow them to pass a null piddle and have it carry some meaning:
>>>
>>> my $t;
>>> if ( defined ( $opts{t} )) {
>>> $t = $opts{t};
>>> }
>>>
>>> Surely somebody has thought about this and justified the current
>>> lack of logicals.  If I had to guess, it's because introducing this
>>> behavior would lead to difficult-to-find bugs.  Is that the
>>> reasoning?  Where can I read more?
>>>
>>> Thanks.
>>> David
>>> _______________________________________________
>>> Perldl mailing list
>>> [email protected]
>>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>
>>
>> _______________________________________________
>> Perldl mailing list
>> [email protected]
>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>
>


_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to