On Wed, May 27, 2009 at 1:42 PM, Daniel Carrera
<daniel.carr...@theingots.org> wrote:
> sub postfix:<!> { [*] 1..$^n }
> say 5!;
> WOW!!  That *IS* cool. Can you explain to me how it works? I figured out
> postfix: myself, but the rest is obscure to me.

Key concepts:

1. placeholder variables.   The ^ in $^n means it's a placeholder: no
predeclaration required, and placeholders in an expression are
assigned the passed-in arguments in serial order.  (The sub could also
have been written more traditionally as  sub postfix:<!>($n) { [*]
1..$n } .)

2. the range operator .. :  $x..$y for integers $x and $y generates,
in list context, a list of the integers from $x to $y, inclusive.

3. the reduction meta-operator  [...] :   [OP](@list)  collects the
result of applying OP to the elements of the list in order.  That is,
assuming foo() is a binary sub,  [foo](1,2,3,4) =
foo(foo(foo(1,2),3),4).  So [+](@list) generates a sum of the listed
values, [*] generates their product, etc.

So, given the argument to !:

1. create a list of integers from 1 to that value (1..$^n)
2. multiply them all together ([*])

and of course a sub without an explicit return statement returns the
value of the last expression.

>> I do think captures are inherently impressive, but not easy to explain...
> Got a link?
> Daniel.

Mark J. Reed <markjr...@gmail.com>

Reply via email to