Oh, you know, think I've spotted a source of confusion in this
thread... Liz-- I think my accident-- replied to me directly, and we
kept going talking about this without cc-ing the list.  So yeah, I
pointed out there was a bug with the routine form of comb that wasn't
in the Str method, and she ran off and fixed it immediately.




On 11/16/19, Elizabeth Mattijsen <l...@dijkmat.nl> wrote:
> I think
> https://github.com/rakudo/rakudo/commit/dd2f072d6aae04bfcf2603c6bdcd2f2e7d804ea8
> fixed it.
>
>> On 16 Nov 2019, at 18:57, Timo Paulssen <t...@wakelift.de> wrote:
>>
>> Oh dang!
>>
>> This may very well be a rakudobug. I've actually never used the sub form
>> of comb, only ever the method form, for which the "match" named
>> parameter definitely exists:
>>
>> "a;b;c".comb(/\w/, match => True);
>> (「a」 「b」 「c」)
>>
>> Someone will have to fix that and then the code from my mail will
>> retroactively become correct ;)
>>
>> HTH
>>   - Timo
>>
>> On 16/11/2019 18:35, William Michels wrote:
>>> Hello Timo, and thank you for taking the time to explain how "comb"
>>> routine signatures work. I have no doubt your description is the
>>> correct way to use comb routine(s) in Raku/Perl6.
>>>
>>> First of all, I should preface my remarks by saying that I'm using
>>> Rakudo (moar) 2019.07.1, with the Linenoise module to run the
>>> Raku/Perl6 REPL. It has been suggested to me that my install might
>>> somehow be broken, because I tried to 'roll-my-own' Rakudo-Star
>>> release (basically I copied over pre-installed modules from my Rakudo
>>> 2019.03 install, and ran 'zef update').
>>>
>>> In any case, I haven't been able to get the code you posted to work. I
>>> checked all six examples in the REPL, and the last example I checked
>>> at the command line as well. I'm hoping someone on the list running
>>> Rakudo (moar) 2019.07.1 can confirm/refute my results:
>>>
>>>> #Timo
>>> Nil
>>>> comb(/\w/, "a;b;c", match => True);
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> comb(/\w/, "a;b;c", :match);
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> comb(/\w/, "a;b;c", :match(True));
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> comb(/\w/, "a;b;c", :!match);
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> comb(/\w/, "a;b;c", :match(False));
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> comb(/\w/, "a;b;c", 2, :match);
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at <unknown file> line 1
>>>
>>>> $*VM
>>> moar (2019.07.1)
>>>> exit
>>> mbook:~ homedir$ perl6 -e 'comb(/\w/, "a;b;c", 2, :match);'
>>> Unexpected named argument 'match' passed
>>>  in block <unit> at -e line 1
>>> mbook:~ homedir$
>>>
>>> As for what's going on, I'm wondering if there might be an issue with
>>> "comb" signatures in general. There exists both a '(Str) routine comb'
>>> and a '(Cool) routine comb'. Maybe these two routines are somehow
>>> interfering with each other?
>>>
>>> Thank you, and any further help appreciated, Bill.
>>>
>>>
>>> On Sat, Nov 16, 2019 at 6:34 AM Timo Paulssen <t...@wakelift.de> wrote:
>>>> Hi Bill,
>>>>
>>>> In your repl examples you're actually passing the True or False as a
>>>> positional parameter, which makes it go into the slot for $limit, not
>>>> the slot for :$match.
>>>>
>>>> In order to pass true or false for the "match" named parameter you have
>>>> different syntactical options:
>>>>
>>>>  comb(/\w/, "a;b;c", match => True) # maybe the simplest is using a
>>>> pair
>>>>
>>>>  comb(/\w/, "a;b;c", :match) # using "colon pair" syntax; it's syntax
>>>> that puts a colon at the beginning and makes a pair
>>>>
>>>>  comb(/\w/, "a;b;c", :match(True)) # :match is short for match => True,
>>>> and :match(True) is long for match => True
>>>>
>>>>  comb(/\w/, "a;b;c", :!match) # putting a ! after the : negates the
>>>> pair, i.e. it's now match => False
>>>>
>>>>  comb(/\w/, "a;b;c", :match(False)) # same value
>>>>
>>>> And on top of that, you can add the third positional parameter to pass a
>>>> value for $limit
>>>>
>>>>  comb(/\w/, "a;b;c", 2, :match) # output up to two results, as match
>>>> objects
>>>>
>>>> Here's a few comments on the examples you pasted:
>>>>
>>>>
>>>>> On another note (or possibly the same note), I tried code similar to >
>>>>> Joe's with fair success. I was able to get the REPL to understand a >
>>>>> "True" or "False" parameter, but never in conjunction with a > "$limit"
>>>>> parameter. Is this the correct behaviour, and why?
>>>> The surprise here comes from Bool actually being derived from Int, and
>>>> therefore being totally acceptable values to pass for $limit.
>>>>>> #REPL > Nil >> say comb(/\w/, "a;b;c", False).perl; > ().Seq You can
>>>>>> see here that it gave no results; that's because it interpreted the
>>>>>> False as 0 in the $limit parameter.
>>>>>> say comb(/\w/, "a;b;c", True).perl; > ("a",).Seq
>>>> Here the True is interpreted as 1 for $limit, giving you just "a", and
>>>> it's a string because the match named parameter wasn't given and
>>>> defaulted to False.
>>>>>> say comb(/\w+/, "a;b;c", True).perl; > ("a",).Seq
>>>> The difference between \w and \w+ isn't noticeable here, as the source
>>>> string only ever has single word character in a row, but you can try
>>>> with "ab;cd;ef" for example with both \w and \w+.
>>>>
>>>>>> say comb(/\w+/, "a;b;c", 2).perl; > ("a", "b").Seq >> say comb(/\w+/,
>>>>>> "a;b;c", 3).perl; > ("a", "b", "c").Seq >> say comb(/\w+/, "a;b;c",
>>>>>> 4).perl; > ("a", "b", "c").Seq >> say comb(/\w+/, "a;b;c", True).perl;
>>>>>> > ("a",).Seq
>>>> Same as above; True being interpreted as 1
>>>>
>>>>>> say comb(/\w+/, "a;b;c", 2, True).perl; > Too many positionals passed;
>>>>>> expected 2 or 3 arguments but got 4 in > block <unit> at <unknown
>>>>>> file> line 1
>>>> There's no syntax here that distinguishes 2, a positional parameter,
>>>> from True, also a positional parameter.
>>>>
>>>>>> say comb(/\w+/, "a;b;c", 2, :True).perl; > Unexpected named argument
>>>>>> 'True' passed in block <unit> at <unknown > file> line 1
>>>> The issue here is that :True is short for True => True, i.e. passing the
>>>> value True to the named parameter called "True", easy to get confused by
>>>> the error message here!
>>>>> Any help appreciated, Bill.
>>>> I hope the explanations make sense!
>>>>  - Timo
>

Reply via email to