On Tue, Jun 12, 2018 at 12:55 PM, Joseph Brenner <doom...@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 <jjmer...@gmail.com>
>   # my @y := @x but LookInside;
>   # suggested by Elizabeth Mattijsen l...@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 <l...@dijkmat.nl> wrote:
>>> On 12 Jun 2018, at 09:06, Joseph Brenner <doom...@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.

Reply via email to