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

Re: mixin syntax: does vs but

Thread Previous | Thread Next
From:
Joseph Brenner
Date:
June 12, 2018 18:58
Subject:
Re: mixin syntax: does vs but
Message ID:
CAFfgvXUa2hqydtjJVC50gMzn8Ea-roAngh2zRw+0O2fw7a9ETw@mail.gmail.com
>> say @y.^WHAT

> If you want to print the name use `.^name`.

> If you want the type object for more advanced usages use `.WHAT`.

Sorry, typo on my part.

Though that raises another syntactic oddity I might whine about: perl6
code examples frequently use ".WHAT".  I was interested in getting a
list of all available methods, so I started trying some guesses:
".METHODS", ".METHOD", ".methods".... But actually it's ".^methods".
Okay, the caret is used for introspection... but then why isn't it
".^what"?

(It also turns out that the list ".^methods" gives you is bizarre:
hard to read, has many duplicates, unsorted, full of odd entries that
look like internal use only widgets I don't care about just now...)




On Tue, Jun 12, 2018 at 11:34 AM, Brad Gilbert <b2gills@gmail.com> wrote:
> On Tue, Jun 12, 2018 at 12:55 PM, Joseph Brenner <doomvox@gmail.com> wrote:
>> Thanks, both your suggestion and JJ Merelo's work, but I think I like
>> yours for readability:
>>
>>   # # using binding, suggested by JJ Merelo <jjmerelo@gmail.com>
>>   # my @y := @x but LookInside;
>>
>>   # suggested by Elizabeth Mattijsen liz@dijkmat.nl
>>   my @y does LookInside = @x;
>>
>> I actually found the use of "but" in the objects docs to be
>> tremendously confusing at first:  it looks like some sort of
>> conditional check, like "unless".
>
> The reason `but` exists is basically for the following
>
>     my $v = 0 but True;
>
>     if $v { say $v } # prints 0
>
> In Perl 5 it is common to return the string `"0 but true"` for a value that is
> both 0 and true.
>
> Since one of the design philosophies of Perl 6 is to reduce the number
> of special cases this was made to be more generally useful.
>
> Note that you should not do the following
>
>     my $v = 0;
>     $v does True;
>
>     say 'WTF!' if 0; # prints WTF!
>
> Basically you can use `but` anywhere you like, but be careful with `does`.
>
>> On Tue, Jun 12, 2018 at 1:01 AM, Elizabeth Mattijsen <liz@dijkmat.nl> wrote:
>>>> On 12 Jun 2018, at 09:06, Joseph Brenner <doomvox@gmail.com> wrote:
>>>>
>>>> I thought this would work to make a copy of @x but with the role
>>>> "LookInside" attached to it:
>>>>
>>>>   my @y = @x but LookInside;
>>>>
>>>> But that didn't add the role to @y. E.g.
>
> That is effectively the same as:
>
>     my @y = (@x but LookInside).map: *.self;
>
> That is @ sigiled variables tend to slurp in iterable values.
>
>>>>  say @y.^WHAT
>
> If you want to print the name use `.^name`.
>
> If you want the type object for more advanced usages use `.WHAT`.
>
>>>>
>>>> Would just report (Array), not (Array+{LookInside}).
>>>
>>> What you’re doing here, is assigning the elements of an Array but Lookinside to a normal Array.  The elements of the Array do not have any roles mixed in, so you wind up with a normal Array with normal elements in them.  Perhaps you meant:
>>>
>>>     my @y does LookInside = @x;
>>>
>>> Here you create an Array @y with the role LookInside mixed in, and *then* assign the values from @x.
>>>

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