develooper Front page | perl.perl6.users | Postings from June 2018

Re: need sort help

Thread Previous | Thread Next
From:
Brandon Allbery
Date:
June 9, 2018 20:08
Subject:
Re: need sort help
Message ID:
CAKFCL4VaFM6z4dTm8WUYoJU1c4efGwNozQcnEX+cMRA8Dgsc_A@mail.gmail.com
And in the others, you've provided an explicit invocant with "<invocant of
some kind>.sort", so again it knows it's a method call and has an invocant
already.

A sub can be forced to be a method call instead by using ":" and providing
the invocant *before* the colon:  say sort(<3 5 2 1>: {$^a <=> $^b})

On Sat, Jun 9, 2018 at 4:05 PM Brandon Allbery <allbery.b@gmail.com> wrote:

> The colon only works on a method call. In "say sort:" it's not used as a
> method, it's used as a sub; the colon causes it to try to reinterpret as a
> method call, then it can't find an invocant for the method to operate on.
>
> In "@x .= sort:", the ".=" forces a method call with @x as invocant; then
> "sort:" has an invocant to work with.
>
> On Sat, Jun 9, 2018 at 4:02 PM Xin Cheng <xincheng99@gmail.com> wrote:
>
>> Thanks. But I am actually confused by the use of colon in
>>
>> Sort: { ... }
>>
>> What does it mean in the above statement? I have done several experiments
>> like:
>>
>> p6 'say sort({$^a <=> $^b}, < 3 5 2 1>)'        # (1 2 3 5)
>>
>> p6 'say <3 5 2 1>.sort({$^a <=> $^b})'         # it works.
>>
>> p6 'say <3 5 2 1>.sort: {$^a <=> $^b}'          # it works.
>>
>> But I don't know what the colon here mean, although I know it works.
>>
>> If I write something like this,
>>
>> p6 'say sort: {$^a <=> $^b} < 3 5 2 1> '      # It doesn't work.
>>
>> But why? Why the colon works in one form, but not in another form? So I
>> want to know the meaning of the colon when it works.
>>
>> Regards
>>
>> Xin
>>
>> On Jun 9, 2018, at 3:01 PM, Brandon Allbery <allbery.b@gmail.com> wrote:
>>
>> The ".=" operator means call the method on the right, with the thing on
>> the left as invocant, and assign the result back to the thing on the left.
>> So
>>
>>     @x .= sort: ...
>>
>> is the same as
>>
>>     @x = @x.sort(...)
>>
>> So you're being confused by the syntactic "magic" of ".=".
>>
>> On Sat, Jun 9, 2018 at 2:58 PM Xin Cheng <xincheng99@gmail.com> wrote:
>>
>>> I got the point for //.
>>>
>>> Another question is about calling the method sort with a code block. I
>>> can understand
>>>
>>> @x .= sort({ ... });
>>>
>>> But I don't quite understand why this form also works.
>>>
>>> @x .= sort: { ... };
>>>
>>> I look into the documentation for infix ":",
>>> https://docs.perl6.org/routine/: , and it explains something like this:
>>>
>>> Used as an argument separator just like infix , and marks the argument
>>> to its left as the invocant. That turns what would otherwise be a function
>>> call into a method call.
>>>
>>> substr('abc': 1);       # same as 'abc'.substr(1)
>>> Infix : is only allowed after the first argument of a non-method call.
>>> In other positions, it's a syntax error.
>>>
>>>
>>> How does the above explanation related to the case in hand @x .= sort: {
>>> ... }; ? Is sort an invocant? Or I miss something.
>>>
>>> Regards
>>>
>>> Xin
>>>
>>>
>>>
>>> On Jun 9, 2018, at 12:44 PM, Brandon Allbery <allbery.b@gmail.com>
>>> wrote:
>>>
>>> More precisely, at that point you have a bunch of numbers, but possibly
>>> not as many as expected if some of the components weren't numeric (or all
>>> of them, as when there are files present that aren't the expected logs).
>>> Which means some or all of those variables will be undefined instead of
>>> numbers. The // replaces those with the following value (0), so they do
>>> something sensible when sorted instead of producing warnings.
>>>
>>> On Sat, Jun 9, 2018 at 11:40 AM Xin Cheng <xincheng99@gmail.com> wrote:
>>>
>>>> This is very interesting. But I wonder how it works. I can understand
>>>> the first line
>>>>
>>>>  my ($month, $day, $year, $hour, $minute, $second) = .comb(/\d+/);
>>>>
>>>> Which extract the variables from $_. What is the second line doing, it
>>>> is very concise.
>>>>
>>>>  ($year // 0, $month // 0, $day // 0, $hour // 0, $minute // 0,
>>>> $second // 0, $_);
>>>>
>>>> Could somebody explain in some more words.? What does  // do? Why it
>>>> sorts the array?
>>>>
>>>> Regards
>>>>
>>>> Xin
>>>>
>>>> On Jun 9, 2018, at 12:51 AM, Timo Paulssen <timo@wakelift.de> wrote:
>>>>
>>>> That's unnecessarily long and complicated, here's how you can do it much
>>>> easier:
>>>>
>>>>     @x.sort: {
>>>>         my ($month, $day, $year, $hour, $minute, $second) =
>>>> .comb(/\d+/);
>>>>         ($year // 0, $month // 0, $day // 0, $hour // 0, $minute // 0,
>>>> $second // 0, $_);
>>>>     }
>>>>
>>>> Trying it on some input data:
>>>>
>>>>     cimtrak.log.06-08-2018_16:07:39.zip
>>>>     cimtrak.log.06-08-2018_17:07:39.zip
>>>>     cimtrak.log.07-08-2018_06:07:39.zip
>>>>     cimtrak.log.07-08-2018_16:07:39.zip
>>>>     cimtrak.log.12-08-2016_06:07:39.zip
>>>>     cookies
>>>>     asbestos
>>>>     fire engine
>>>>     perl6
>>>>     butterflies
>>>>
>>>> results in:
>>>>
>>>>     asbestos
>>>>     butterflies
>>>>     cookies
>>>>     fire engine
>>>>     perl6
>>>>     cimtrak.log.12-08-2016_06:07:39.zip
>>>>     cimtrak.log.06-08-2018_16:07:39.zip
>>>>     cimtrak.log.06-08-2018_17:07:39.zip
>>>>     cimtrak.log.07-08-2018_06:07:39.zip
>>>>     cimtrak.log.07-08-2018_16:07:39.zip
>>>>
>>>> This is the schwartzian transform that was mentioned in another mail.
>>>> why it wasn't actually shown, i have no clue :)
>>>>
>>>> Hope that helps
>>>>   - Timo
>>>>
>>>>
>>>>
>>>
>>> --
>>> brandon s allbery kf8nh                               sine nomine
>>> associates
>>> allbery.b@gmail.com
>>> ballbery@sinenomine.net
>>> unix, openafs, kerberos, infrastructure, xmonad
>>> http://sinenomine.net
>>>
>>>
>>>
>>
>> --
>> brandon s allbery kf8nh                               sine nomine
>> associates
>> allbery.b@gmail.com
>> ballbery@sinenomine.net
>> unix, openafs, kerberos, infrastructure, xmonad
>> http://sinenomine.net
>>
>>
>>
>
> --
> brandon s allbery kf8nh                               sine nomine
> associates
> allbery.b@gmail.com
> ballbery@sinenomine.net
> unix, openafs, kerberos, infrastructure, xmonad
> http://sinenomine.net
>


-- 
brandon s allbery kf8nh                               sine nomine associates
allbery.b@gmail.com                                  ballbery@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About