Side note, using the angle brackets creates IntStr objects, which in some cases is harmless, sometimes necessary.
> say <1 2 4 8 16 >.perl (IntStr.new(1, "1"), IntStr.new(2, "2"), IntStr.new(4, "4"), IntStr.new(8, "8"), IntStr.new(16, "16")) > say (1,2,4,8,16).perl (1, 2, 4, 8, 16) That's thanks to allomorphs from quote-word - https://docs.perl6.org/language/glossary#index-entry-Allomorph* "**Keep in mind that certain constructs, such as sets, bags, and mixes care about object identity, and so will not accept an allomorph as equivalent of its components alone."* I usually save angle brackets for strings but in this case, MAIN is getting IntStr, so we have to also have IntStr for the Set operator element-of: sub MAIN(Int $value where $value ∈ <1 2 4 8 16>) { say "\$value.perl = ",$value.perl } perl6 main.p6 4 *says $value.perl = IntStr.new(4, "4")* sub MAIN(Int $value where $value ∈ (1,2,4,8,16)) {say "\$value.perl = ",$value.perl } perl6 main.p6 4 *says Type check failed in binding to parameter '<anon>'; expected Any but got Mu (Mu)* * in block <unit> at main.p6 line 1* Which brings up another question- how to coerce $value to Int? These don't work, even though IntStr has an Int() method. sub MAIN(Int(IntStr) $value where $value ∈ (1,2,4,8,16)) {say "\$value.perl = ",$value.perl } sub MAIN(Int() $value where $value ∈ (1,2,4,8,16)) {say "\$value.perl = ",$value.perl } -y On Thu, Apr 18, 2019 at 5:31 PM mimosinnet <mimosin...@gmail.com> wrote: > El Sunday, 03 de March del 2019 a les 02:09, ToddAndMargo via perl6-users > va escriure: > > >I want to pass an integer to a sub. The only > >valid values of the integer are 1, 2, 4, 8, and 16. > > > >Other than using "if" to test their values, is > >there a way to state that an integer can only > >have certain predefined values? > > I like this syntax: > > sub MAIN(Int $value where $value ∈ <1 2 4 8 16 >) { > .... > } > > It is readable and I really like to use the '∈' symbol :D. > > Cheers! > > -- > (≧∇≦) Mimosinnet (Linux User: #463211) >