develooper Front page | perl.perl5.porters | Postings from September 2009

Perl 5.10.1 Smartmatch Num ~~ Numish Options

Thread Next
From:
T User
Date:
September 1, 2009 11:19
Subject:
Perl 5.10.1 Smartmatch Num ~~ Numish Options
Message ID:
7dcbc5430909010726y19d9a358kcc1ece62f2c83195@mail.gmail.com
On 31 août, 13:13, Ben Morrow <b...@morrow.me.uk> wrote:
> Quoth tuser <tus...@gmail.com>:
>
> > Why is 2 ~~ '2.0' false in Perl 6 (case #A2), whereas the identical
> > expression in Perl 5.10.1 (case #B2) is true ?
>
> > Or in other words:
> > Why is there a rule in Perl 5.10.1 ("Num numish numeric equality"),
> > where there is no equivalent in Perl 6 ?
>
> For a proper answer you would have to ask p5p

Here is the question that goes to p5p:

 In Perl 6, I find the following about smart matching:

http://perlcabal.org/syn/S03.html#Smart_matching

$_     X     Type of Match Implied Match if (given $_)
====== ===== ===================== ===================
[...]
Any    Num   numeric equality      +$_ == X
Any    Str   string equality       ~$_ eq X
[...]
====== ===== ===================== ===================

That means in Perl 6:
=====================
case #A1: 2 ~~  2.0  translates into 2 ==  2.0  ==> true
case #A2: 2 ~~ '2.0' translates into 2 eq '2.0' ==> false

In perl 5.10.1, I find the following about smart matching:

http://search.cpan.org/~dapm/perl-5.10.1-RC1/pod/perlsyn.pod#Smart_matching_in_detail

$a      $b        Type of Match Implied    Matching Code
======  =====     =====================    =============
[...]
Any     Num       numeric equality         $a == $b
Num     numish[4] numeric equality         $a == $b
[...]
Any     Any       string equality          $a eq $b
======  =====     =====================    =============
[4] either a real number, or a string that looks like a number

That means in Perl 5.10.1:
==========================
case #B1: 2 ~~  2.0  translates into 2 ==  2.0  ==> true
case #B2: 2 ~~ '2.0' translates into 2 == '2.0' ==> true

The question I have is:
Why is 2 ~~ '2.0' false in Perl 6 (case #A2), whereas the identical
expression in Perl 5.10.1 (case #B2) is true ?

Or in other words:
Why is there a rule in Perl 5.10.1 ("Num numish numeric equality"),
where there is no equivalent in Perl 6 ?


> but I would guess it's so that something like
>
>     my $x = 3;
>     print $x;
>     "3.0" ~~ $x;
>
> does what is expected. The 'print' statement has converted $x into a
> dualvar, and there is no way to tell which part (string or number) came
> 'first', so perl will treat it as a string. It's different from Perl 6
> because Perl 5's dynamic type system is quite different from Perl 6's.

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About