2017-12-24 126 views
5

Wydaje is-prime i .is-prime traktują swoje argumenty inaczej:Czy jest jakaś różnica między .is-prime i is-prime() w Perlu 6?

> is-prime('11') 
True 
> '11'.is-prime 
No such method 'is-prime' for invocant of type 'Str' 
    in block <unit> at <unknown file> line 1 
> is-prime(2.5) 
False 
> (2.5).is-prime 
No such method 'is-prime' for invocant of type 'Rat' 
    in block <unit> at <unknown file> line 1 
+1

Niezupełnie. [ '.is-prime'] (https://github.com/rakudo/rakudo/blob/202459ce0b9cf0170339d543529c9415d52ac3d4/src/core/Int.pm#L140-L142) [' jest drugorzędnych() '] (https://github.com/rakudo/rakudo/blob/202459ce0b9cf0170339d543529c9415d52ac3d4/src/core/Int.pm#L449-L456) –

+0

@BradGilbert oczywiście. Ale dlaczego różnica? –

+0

'say is-prime 5' vs' 5.is-prime.say'. Ogólnie rzecz biorąc, jeśli istnieją dwa sposoby wyboru języka programowania, Perl 6 wybiera oba. –

Odpowiedz

3

Oto procedura definicja z Int class

proto sub is-prime($) is pure {*} 
multi sub is-prime(Int:D \i) { 
    nqp::p6bool(nqp::isprime_I(nqp::decont(i), nqp::unbox_i(100))); 
} 
multi sub is-prime(\i) { 
    i == i.floor 
    && nqp::p6bool(nqp::isprime_I(nqp::decont(i.Int), nqp::unbox_i(100))); 
} 

W drugim multi na isprime_I przekształca swój argument z .Int. Wszystko, co ma tę metodę, może następnie zwrócić liczbę całkowitą, która może być liczbą pierwszą.

Ta asymetria jedna z rzeczy, których nie lubię o Perl 6. Jeśli mamy procedurę, która może to zrobić w ten sposób powinniśmy przesunąć metoda wyżej w strukturze klasowej.

+1

Jeśli się nie mylę (nie jestem zaznajomiony ze składnią nqp), 'isprime_I' ma' i.Int' jako argument, a nie 'i.floor'. 'i.floor' służy tylko do sprawdzenia, czy' i' jest liczbą całkowitą. –

+1

Tak, absolutnie poprawne i zaktualizowałem swoją odpowiedź. –

+2

Myślę, że ta asymetria jest historyczna: od czasów, w których 'metoda' wywołuje znacznie mniej optymalizacji niż wywołania' sub'. Idea ta zawsze była taka, że ​​podwersje powinny być interfejsem do metod, aby każda klasa mogła zaimplementować własną wersję sub i po prostu by działała. Myślę, że naprawimy to po drodze do 6.d –