On Sat, Feb 04, 2017 at 08:39:52PM -0800, ToddAndMargo wrote:
: Are there any special rules, like in Perl 5? Do I need to
: pre-declare the sub?
: sub BummerDude ($);
: sub BummerDude ($) { do something; }

For normal subs, you never have to predeclare, because the calling syntax can
assume an unrecognized function name just isn't defined yet, and waits till the
end to double-check that there really was a function of that name defined.

We don't do the equivalent of Perl 5's ($) prototype with normal subs, so you
don't accidentally fall into the situation of modifying the current grammar.
(Functions always assume they take a list of arguments, syntactically speaking.)
You can make a unary function, but you have to explicitly declare an operator:

    sub prefix:<BummerDude> ($argh) { die $argh }

This does have to be declared before you can use it, but unlike in Perl 5,
you don't have to predeclare to use your new prefix recursively, because
it introduces the new operator the moment it sees it, even before it
parses the block that implements the operator.  (Perl 5 doesn't
introduce new syntax till the next statement, which is too late really,
which is why Perl 6 does it sooner.)  So if you want, you can write
factorial recursively like this:

    sub postfix:<!>(Int $n) { if $n < 2 { 1 } else { $n * ($n - 1)! } }
    say 42!

(Of course, that's not how we'd usually write factorial, since

    sub postfix:<!>(Int $n) { [*] 2..$n }

is easier.)


Reply via email to