Re: valid values?

2019-03-04 Thread Norman Gaywood
On Tue, 5 Mar 2019 at 01:23, Brad Gilbert  wrote:

>
> Somewhere on the Internet I layed out the rules that I think that
> should normally be followed, but I am not sure where.
>

Perhaps:

https://stackoverflow.com/questions/54338491/string-matching-in-main-parameters


-- 
Norman Gaywood, Computer Systems Officer
School of Science and Technology
University of New England
Armidale NSW 2351, Australia

ngayw...@une.edu.au  http://turing.une.edu.au/~ngaywood
Phone: +61 (0)2 6773 2412  Mobile: +61 (0)4 7862 0062

Please avoid sending me Word or Power Point attachments.
See http://www.gnu.org/philosophy/no-word-attachments.html


Re: valid values?

2019-03-04 Thread Tom Browder
On Mon, Mar 4, 2019 at 8:22 AM Brad Gilbert  wrote:
...
> Somewhere on the Internet I layed out the rules that I think that
> should normally be followed, but I am not sure where.
...

It would be nice to find it and add to the docs.

-Tom


Re: valid values?

2019-03-04 Thread Brad Gilbert
An Array isn't a type of Str.

@ ~~ Str; # False
Array ~~ Str; # False

You can have an array that has a type constraint.

(my Str @) ~~ Array[Str]; # True
(my @ of Str) ~~ Array[Str]; # True

Or you could check that all of the values of the Array are of some type.

(my @ = ) ~~ *.all ~~ Str
(my @ = ) ~~ (.all ~~ Str)

This is one of the few times that it is acceptable to have a ~~ in a
smart-match.

sub test1(:@array? where .all ~~ Str) { say 'ok' }

test1; # ok
test1 array => ; # ok

test1 array => (1,2,3);
# Constraint type check failed in binding to parameter '@array'; …

Somewhere on the Internet I layed out the rules that I think that
should normally be followed, but I am not sure where.

On Mon, Mar 4, 2019 at 5:32 AM Fernando Santagata
 wrote:
>
> Hi Brad,
>
> How far should I follow the rule that I should not use a smartmatch in a 
> where clause?
>
> I'm thinking of this:
>
> > sub test1(:@array? where Str) { say 'ok' }
> 
> > test1()
> Constraint type check failed in binding to parameter '@array'; expected 
> anonymous constraint to be met but got Array ($[])
>   in sub test1 at  line 1
>   in block  at  line 1
>
> > sub test2(:@array? where .all ~~ Str) { say 'ok' }
> 
> > test2()
> ok
>
> The where clause in test1() doesn't work, but is the clause in test2() 
> dangerous (action at a distance)? Should I rephrase it differently?
>
> On Mon, Mar 4, 2019 at 5:29 AM Brad Gilbert  wrote:
>>
>> The `where` clause is already a smart-match, adding `~~` to it is not
>> only redundant, it can cause confusing action at a distance.
>> (By that I mean the right side of `where` is exactly the same as the
>> right side of `~~`)
>>
>> You wouldn't write this:
>>
>> * ~~ (* ~~ 1|2|4|8|16)
>>
>> So don't write this either:
>>
>> … where * ~~ 1|2|4|8|16
>>
>> ---
>>
>> It should be
>>
>> sub mysub(Int $value where 1|2|4|8|16)
>>{
>>   say "Got $value"
>> }
>>
>> On Sun, Mar 3, 2019 at 4:16 AM Fernando Santagata
>>  wrote:
>> >
>> > Hi Todd,
>> > is this what you're looking for?
>> >
>> > sub mysub(Int $value where * ~~ 1|2|4|8|16)
>> > {
>> >   say "Got $value"
>> > }
>> >
>> > mysub 2; # Got 2
>> > mysub 3; # Constraint type check failed in binding to parameter '$value'; 
>> > expected anonymous constraint to be met but got Int (3)
>> >
>> > On Sun, Mar 3, 2019 at 11:09 AM ToddAndMargo via perl6-users 
>> >  wrote:
>> >>
>> >> Hi All,
>> >>
>> >> 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?
>> >>
>> >> Many thanks,
>> >> -T
>> >>
>> >> --
>> >> ~~~
>> >> Having been erased,
>> >> The document you're seeking
>> >> Must now be retyped.
>> >> ~~~
>> >
>> >
>> >
>> > --
>> > Fernando Santagata
>
>
>
> --
> Fernando Santagata


Re: valid values?

2019-03-04 Thread Fernando Santagata
Hi Brad,

How far should I follow the rule that I should not use a smartmatch in a
where clause?

I'm thinking of this:

> sub test1(:@array? where Str) { say 'ok' }

> test1()
Constraint type check failed in binding to parameter '@array'; expected
anonymous constraint to be met but got Array ($[])
  in sub test1 at  line 1
  in block  at  line 1

> sub test2(:@array? where .all ~~ Str) { say 'ok' }

> test2()
ok

The where clause in test1() doesn't work, but is the clause in test2()
dangerous (action at a distance)? Should I rephrase it differently?

On Mon, Mar 4, 2019 at 5:29 AM Brad Gilbert  wrote:

> The `where` clause is already a smart-match, adding `~~` to it is not
> only redundant, it can cause confusing action at a distance.
> (By that I mean the right side of `where` is exactly the same as the
> right side of `~~`)
>
> You wouldn't write this:
>
> * ~~ (* ~~ 1|2|4|8|16)
>
> So don't write this either:
>
> … where * ~~ 1|2|4|8|16
>
> ---
>
> It should be
>
> sub mysub(Int $value where 1|2|4|8|16)
>{
>   say "Got $value"
> }
>
> On Sun, Mar 3, 2019 at 4:16 AM Fernando Santagata
>  wrote:
> >
> > Hi Todd,
> > is this what you're looking for?
> >
> > sub mysub(Int $value where * ~~ 1|2|4|8|16)
> > {
> >   say "Got $value"
> > }
> >
> > mysub 2; # Got 2
> > mysub 3; # Constraint type check failed in binding to parameter
> '$value'; expected anonymous constraint to be met but got Int (3)
> >
> > On Sun, Mar 3, 2019 at 11:09 AM ToddAndMargo via perl6-users <
> perl6-users@perl.org> wrote:
> >>
> >> Hi All,
> >>
> >> 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?
> >>
> >> Many thanks,
> >> -T
> >>
> >> --
> >> ~~~
> >> Having been erased,
> >> The document you're seeking
> >> Must now be retyped.
> >> ~~~
> >
> >
> >
> > --
> > Fernando Santagata
>


-- 
Fernando Santagata


Re: valid values?

2019-03-04 Thread ToddAndMargo via perl6-users

On 3/3/19 8:29 PM, Brad Gilbert wrote:

It should be

 sub mysub(Int $value where 1|2|4|8|16)
{
   say "Got $value"
 }



:-)