What's "integer"?
<追記>
id:tokuhiromによれば,これは10e100+0.1を整数として扱ってしまい,またマシンの制約上10e100と10e100+0.1を識別する方法はないため,良くないのではないかということだ。
よって,正規リリース後に詳細を追記する。追記>
MouseのInt制約で,大きな整数が通らないというバグレポートをもらった*1。
確かに,以下の数値は値としては整数だが,MooseにせよMouseにせよInt制約は通らない。
$ perl -E 'say 10e100' # 10後に0が100個並ぶ数 10e100 $ perl -Mouse has value => (is => "rw", isa => "Int"); __PACKAGE__->new(value => 10e100); __END__ Attribute (value) does not pass the type constraint because: Validation failed for 'Int' failed with value 1e+101 at - line 5 $ perl -Moose has value => (is => "rw", isa => "Int"); __PACKAGE__->new(value => 10e100); __END__ Attribute (value) does not pass the type constraint because: Validation failed for 'Int' failed with value 1e+101 at (snip) $
解決策としては, Perl_fmod(value, 1) == 0
(XSの場合)やPOSIX::fmod($value, 1) == 0
(PPの場合)で解決できるようだ。
ところで,perlfaqには「How do I determine whether a scalar is a number/whole/integer/float?」というセクションがあるが,それによれば整数とは以下のように判別できるとある。
if (/^-?\d+$/) { print "is an integer\n" }
MooseのInt制約や,Mouse::PurePerlのInt制約は実際にこのようになっている*2。
しかし,これは10e100に対しては動かない。10e100は文字列として評価するとあくまでも"10e100"だからだ。整数かどうかを識別するためだけにPOSIXモジュールをロードするのも大げさだが,そういうものだと思って諦めるほかないのだろうか。