Seems like we can answer "Is it also true when compiling?" by putting the
REPL code into a file!

$ cat order-execution.raku
class Y { method  y (Int $y) {note $y}}
my Y $y .= new;

sub b (Int $i --> Int) { note "about to increment i above $i"; $i + 10 }

say b(10);

say $y.?y(b(11));

say $y.?undef(b(12));

$ perl6 order-execution.raku
about to increment i above 10
20
about to increment i above 11
21
True
about to increment i above 12
Nil

$ perl6 --version
*This is Rakudo Star version 2019.03.1 built on MoarVM version 2019.03
**implementing
Perl 6.d.*

Yes Rakudo is executing the args for something that it doesn't end up
calling. Seems overly-eager for a language that is properly lazy by design.
I'd be interested in seeing documentation for this order-of-operations if
it exists.

By the way I had to look up .? -
https://docs.perl6.org/language/operators#index-entry-methodop_.%3F

methodop .? <https://docs.perl6.org/language/operators#___top>

Safe call operator. $invocant.?method calls method method on $invocant if
it has a method of such name. Otherwise it returns Nil
<https://docs.perl6.org/type/Nil>.

Technically, not a real operator; it's syntax special-cased in the compiler.

-y


On Sun, Oct 20, 2019 at 10:12 AM Marcel Timmerman <mt1...@gmail.com> wrote:

> Hello all,
>
> I've a small question where I want to know what is processed first in
> the following line
>
>
> $my-object.?"my-method"(some-complex-argument-calculation())
>
>
> Will the sub 'some-complex-argument-calculation()' always be run even
> when 'my-method' is not available because the sub must be executed
> before the method is called.
>
>
> In the REPL the sub is called despite a method is not defined. Is it
> also true when compiling?
>
>
>  > class Y { method  y (Int $y) {note $y}}
> (Y)
>
>  > my Y $y .= new
> Y.new
>
>  >sub b (Int $i --> Int) { note "$i"; $i + 10 }
> &b
>
>  > b(10)
> 10
> 20
>
>  > $y.?y(b(10))
> 10
> 20
> True
>
>  > $y.?undef(b(10))
> 10
> Nil
>
>
> Regards
> Marcel
>

Reply via email to