{*} 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.santagata@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 >Thread Previous | Thread Next