在Perl 6中,.is-prime和is-prime()之间是否有一些区别?

Eug*_*sky 5 perl6

似乎is-prime.is-prime以不同方式对待他们的论点:

> 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
Run Code Online (Sandbox Code Playgroud)

bri*_*foy 3

这是Int 类的例程定义

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)));
}
Run Code Online (Sandbox Code Playgroud)

在第二个中,multiisprime_I其参数转换为.Int。任何具有该方法的东西都可以返回一个可能是质数的整数。

这种不平衡是我不喜欢 Perl 6 的原因之一。如果我们有一个可以这样做的例程,我们应该将该方法移到类结构中的更高位置。

  • 我认为这种不平衡是历史性的:从“method”调用的时代开始,其优化性就比“sub”调用低得多。这个想法一直是子版本应该是方法的接口,以便任何类都可以实现自己的子版本并且它可以正常工作。我想我们会在 6.d 版本中解决这个问题 (2认同)