{*} is specially handled by the compiler as a term.

Let's say you have a class named Foo:

    class Foo {…}

You wouldn't expect to be able to use it like this:

    F o o.new()

It is the same thing with {*}.
The only difference is that {*} is meant to look like a Block { } combined
with a Whatever *.
It was meant to be both visually distinctive, and visually similar to how
you might think about it.

---

If you were allowed to add spaces to the {*} term, it would be annoying if
you wanted to create a lambda that returned a Whatever.

    my $block = { * };

    say $block.() ~~ Whatever; # True.

On Thu, Jun 25, 2020 at 2:47 AM Fernando Santagata <
nando.santag...@gmail.com> wrote:

> Hi *,
> I was trying to see if one can delegate phasers to a proto, like this:
>
> proto sub foo(|) {
>   ENTER { say 'In' }
>   LEAVE { say 'Out' }
>   {*}
> }
> multi sub foo(Int $a) {
>   $a
> }
> multi sub foo(Str $a) {
>   $a
> }
>
> say foo(1);
> say foo('hello');
>
> Yes indeed, it outputs:
>
> In
> Out
> 1
> In
> Out
> hello
>
> But at first it didn't work, because I added a space on both sides of the
> '*':
>
> proto sub foo(|) {
>   ENTER { say 'In' }
>   LEAVE { say 'Out' }
>   { * }
> }
>
> It outputs:
>
> In
> Out
> *
> In
> Out
> *
>
> If I add a return:
>
> proto sub foo(|) {
>   ENTER { say 'In' }
>   LEAVE { say 'Out' }
>   return { * }
> }
>
> it outputs:
>
> In
> Out
> -> ;; $_? is raw = OUTER::<$_> { #`(Block|94038346387904) ... }
> In
> Out
> -> ;; $_? is raw = OUTER::<$_> { #`(Block|94038346388120) ... }
>
> Why are spaces significant in this case?
>
> If this behavior is intentional, can this be a trap worth being documented?
>
> --
> Fernando Santagata
>

Reply via email to