=encoding utf8

=head1 NAME

Synopsis_06 - Subroutines

=head1 AUTHOR

Damian Conway <damian@conway.org> and
Allison Randal <al@shadowed.net>

=head1 VERSION

  Maintainer: Larry Wall <larry@wall.org>
  Date: 21 Mar 2003
  Last Modified: 21 Nov 2005
  Number: 6
  Version: 12


This document summarizes Apocalypse 6, which covers subroutines and the
new type system.

=head1 Subroutines and other code objects

B<Subroutines> (keyword: C<sub>) are non-inheritable routines with
parameter lists.

B<Methods> (keyword: C<method>) are inheritable routines which always
have an associated object (known as their invocant) and belong to a
particular kind or class.

B<Submethods> (keyword: C<submethod>) are non-inheritable methods, or
subroutines masquerading as methods. They have an invocant and belong to
a particular kind or class.

B<Multimethods> (keyword: C<multi>) are routines that transcend class
boundaries, and can have one or more invocants. 

B<Rules> (keyword: C<rule>) are methods (of a grammar) that perform
pattern matching. Their associated block has a special syntax (see
Synopsis 5).

B<Tokens> (keyword: C<token>) are rules that perform low-level
pattern matching (and also enable rules to do whitespace dwimmery).

B<Macros> (keyword: C<macro>) are routines whose calls execute as soon
as they are parsed (i.e. at compile-time). Macros may return another
source code string or a parse-tree.


=head2 Standard subroutines

The general syntax for named subroutines is any of:

     my RETTYPE sub NAME ( PARAMS ) TRAITS {...}
    our RETTYPE sub NAME ( PARAMS ) TRAITS {...}
                sub NAME ( PARAMS ) TRAITS {...}

The general syntax for anonymous subroutines is:

    sub ( PARAMS ) TRAITS {...}

"Trait" is the name for a compile-time (C<is>) property.
See L<"Traits and Properties">


=head2 Perl5ish subroutine declarations

You can declare a sub without parameter list, as in Perl 5:

    sub foo {...}

Arguments implicitly come in via the C<@_> array, but they are C<readonly>
aliases to actual arguments:

    sub say { print qq{"@_[]"\n}; }   # args appear in @_

    sub cap { $_ = uc $_ for @_ }   # Error: elements of @_ are constant

If you need to modify the elements of C<@_>, declare it explicitly
with the C<is rw> trait:

    sub swap (*@_ is rw) { @_[0,1] = @_[1,0] }


=head2 Blocks

Raw blocks are also executable code structures in Perl 6.

Every block defines an object of type C<Code>, which may either be executed
immediately or passed on as a C<Code> reference argument.  A
bare block where an operator is expected is bound to the current
statement level control syntax.  A bare block where a term is expected
merely produces a reference.  If the term bare block occurs in a list,
it is considered the final element of that list unless followed immediately
by a comma or comma surrogate.

=head2 "Pointy subs"

Semantically the arrow operator C<< -> >> is almost a synonym for
the anonymous C<sub> keyword, except that the parameter list of a
pointy sub does not require parentheses, and a pointy sub may not be
given traits.  Syntactically a pointy sub is parsed exactly like a
bare block.

    $sq = -> $val { $val**2 };  # Same as: $sq = sub ($val) { $val**2 };

    for @list -> $elem {        # Same as: for @list, sub ($elem) {
        print "$elem\n";        #              print "$elem\n";
    }                           #          }

It also behaves like a block with respect to control exceptions.  If you
C<return> from within a pointy sub, it will return from the innermost
enclosing C<sub> or C<method>, not the block itself.  It is referenced
by C<&?BLOCK>, not C<&?SUB>.

=head2 Stub declarations

To predeclare a subroutine without actually defining it, use a "stub block":

    sub foo {...}     # Yes, those three dots are part of the actual syntax

The old Perl 5 form:

    sub foo;

is a compile-time error in Perl 6 (for reasons explained in Apocalypse 6).

Redefining a stub subroutine does not produce an error.  To redefine
any other subroutine you must explicitly use the "C<is instead>" trait.

The C<...> is the "yadayadayada" operator, which is executable but returns
a failure.  You can also use C<???> to produce a warning, or C<!!!> to
always die.  These also officially define stub blocks if used as the
only expression in the block.


=head2 Globally scoped subroutines

Subroutines and variables can be declared in the global namespace, and are
thereafter visible everywhere in a program.

Global subroutines and variables are normally referred to by prefixing
their identifiers with C<*> (short for "C<GLOBAL::>").   The C<*>
is normally required on the declaration but may be omitted on use if
the reference is unambiguous:

    $*next_id = 0;
    sub *saith($text)  { print "Yea verily, $text" }

    module A {
        my $next_id = 2;    # hides any global or package $next_id
        saith($next_id);    # print the lexical $next_id;
        saith($*next_id);   # print the global $next_id;
    }

    module B {
        saith($next_id);    # Unambiguously the global $next_id
    }

Only the name is installed into the C<GLOBAL> package by C<*>.  To define
subs completely within the scope of the C<GLOBAL> namespace you should
use "C<package GLOBAL {...}>" around the declaration.

=head2 Lvalue subroutines

Lvalue subroutines return a "proxy" object that can be assigned to.
It's known as a proxy because the object usually represents the
purpose or outcome of the subroutine call.

Subroutines are specified as being lvalue using the C<is rw> trait.

An lvalue subroutine may return a variable:

    my $lastval;
    sub lastval () is rw { return $lastval }
 
or the result of some nested call to an lvalue subroutine:

    sub prevval () is rw { return lastval() }

or a specially tied proxy object, with suitably programmed
C<FETCH> and C<STORE> methods:

    sub checklastval ($passwd) is rw {
        return new Proxy:
                FETCH => sub ($self) {
                            return lastval();
                         },
                STORE => sub ($self, $val) {
                            die unless check($passwd);
                            lastval() = $val;
                         };
    }

Other methods may be defined for specialized purposes such as temporizing
the value of the proxy.

=head2 Operator overloading

Operators are just subroutines with special names and scoping.
An operator name consists of a grammatical category name followed by
a single colon followed by an operator name specified as if it were
a hash subscript (but evaluated at compile time).  So any of these
indicate the same binary addition operator:

    infix:<+>
    infix:«+»
    infix:<<+>>
    infix:{'+'}
    infix:{"+"}

Use the C<&> sigil just as you would on ordinary subs.

Unary operators are defined as C<prefix> or C<postfix>:

    sub prefix:<OPNAME>  ($operand) {...}
    sub postfix:<OPNAME> ($operand) {...}

Binary operators are defined as C<infix>:

    sub infix:<OPNAME> ($leftop, $rightop) {...}

Bracketing operators are defined as C<circumfix> where a term is expected
or C<postcircumfix> where a postfix is expected.  A two-element slice
containing the leading and trailing delimiters is the name of the
operator.

    sub circumfix:<LEFTDELIM RIGHTDELIM> ($contents) {...}
    sub circumfix:{'LEFTDELIM','RIGHTDELIM'} ($contents) {...}

Contrary to A6, there is no longer any rule about splitting an even
number of characters.  You must use a two element slice.  Such names
are canonicalized to a single form within the symbol table, so you
must use the canonical name if you wish to subscript the symbol table
directly (as in C<< PKG::{'infix:<+>'} >>).  Otherwise any form will
do.  (Symbolic references do not count as direct subscripts since they
go through a parsing process.)  The canonical form always uses angle
brackets and a single space between slice elements.  The elements
are not escaped, so C<< PKG::circumfix:{'<','>'} >> is canonicalized
to C<<< PKG::{'circumfix:<< >>'} >>>, and decanonicalizing always
involves stripping the outer angles and splitting on space, if any.
This works because a hash key knows how long it is, so there's no
ambiguity about where the final angle is.  And space works because
operators are not allowed to contain spaces.

Operator names can be any sequence of non-whitespace characters
including Unicode characters. For example:

    sub infix:<(c)> ($text, $owner) { return $text but Copyright($owner) }
    method prefix:<±> (Num $x) returns Num { return +$x | -$x }
    multi sub postfix:<!> (Int $n) { $n < 2 ?? 1 :: $n*($n-1)! }
    macro circumfix:«<!-- -->» ($text) is parsed / .*? / { "" }

    my $document = $text (c) $me;

    my $tolerance = ±7!;

    <!-- This is now a comment -->

Whitespace may never be part of the name (except as separator
within a C<< <...> >> or C<«...»> slice, as in the example above).

A null operator name does not define a null or whitespace operator, but
a default matching rule for that syntactic category, which is useful when
there is no fixed string that can be recognized, such as tokens beginning
with digits.  Such an operator I<must> supply an C<is parsed> trait.
The Perl grammar uses a default rule for the C<:1st>, C<:2nd>, C<:3rd>,
etc. rule modifiers, something like this:

    sub rxmodexternal:<> ($x) is parsed(rx:p/\d+[st|nd|rd|th]/) {...}

Such default rules are attempted in the order declared.  (They always follow
any rules with a known prefix, by the longest-token-first rule.)

Although the name of an operator can be installed into any package or
lexical namespace, the syntactic effects of an operator declaration are
always lexically scoped.  Operators other than the standard ones should
not be installed into the C<*> namespace.  Always use exportation to make
non-standard syntax available to other scopes.

=head1 Parameters and arguments

Perl 6 subroutines may be declared with parameter lists.

By default, all parameters are readonly aliases to their corresponding
arguments--the parameter is just another name for the original
argument, but the argument can't be modified through it. To allow
modification, use the C<is rw> trait. To pass-by-copy, use the C<is copy>
trait.

Parameters may be required or optional. They may be passed by position,
or by name. Individual parameters may confer a scalar or list context
on their corresponding arguments, but unlike in Perl 5, this is decided
lazily at parameter binding time.

Arguments destined for required positional parameters must come before
those bound to optional positional parameters. Arguments destined
for named parameters may come before and/or after the positional
parameters.  (To avoid confusion it is highly recommended that all
positional parameters be kept contiguous in the call syntax, but
this is not enforced, and custom arg list processors are certainly
possible on those arguments that are bound to a final slurpy or
arglist variable.)

Named arguments are recognized syntactically at the
"comma" level.  Pairs intended as positional arguments rather than
named arguments must be isolated by extra parens:

    doit :when<now>,1,2,3;	# always a named arg
    doit (:when<now>),1,2,3;	# always a positional arg

    doit when => 'now',1,2,3;	# always a named arg
    doit (when => 'now'),1,2,3;	# always a positional arg

Going the other way, pairs intended as named arguments that don't look
like pairs must be introduced with C<*>:

    $pair = :when<now>;
    doit $pair,1,2,3;	# always a positional arg
    doit *$pair,1,2,3;	# always a named arg

Likewise, if you wish to pass a hash and have its entries treated as
named arguments, you must introduce it with a C<*>:

    %pairs = {:when<now> :what<any>};
    doit %pairs,1,2,3;	# always a positional arg
    doit *%pairs,1,2,3;	# always named args

Variables with a C<:> prefix in rvalue context autogenerate pairs, so you
can also say this:

    $when = 'now';
    doit $when,1,2,3;	# always a positional arg of 'now'
    doit :$when,1,2,3;	# always a named arg of :when<now>

In other words C<:$when> is shorthand for C<:when($when)>.  This works
for any sigil:

    :$what	:what($what)
    :@what	:what(@what)
    :%what	:what(%what)
    :&what	:what(&what)

There is a corresponding shortcut for hash keys if you prefix the
subscript instead of the sigil.  The C<:> is not functioning as an
operator here, but as a modifier of the following token:


    doit %hash:<a>,1,2,3;
    doit %hash:{'b'},1,2,3;

are short for

    doit :a(%hash<a>),1,2,3;
    doit :b(%hash{'b'}),1,2,3;

To pass pairs out of hash without their being interpreted as named
parameters, use

    doit %hash<a>:p,1,2,3;
    doit %hash{'b'}:p,1,2,3;

instead.

Pairs are recognized syntactically at the call level and mystically
transformed into special C<Named> objects that may be bound to
positionals only by name, not as ordinary positional C<Pair> objects.
Leftover special C<Named> objects can be slurped into a slurpy hash.

After the positional and named arguments, all the rest of the arguments
are taken to be list arguments.  Any pairs within the list are taken
to be list elements rather than named arguments, and mystically show
up as C<Pair> arguments even if the compiler marked them as C<Named>.

It is possible that named pairs are not really a separate type; it
would be sufficient to have a bit somewhere in the Pair that can be
interrogated under the C<.named> property.  The compiler is allowed to
stop marking "named" pairs at the first C<< <== >>, but the code that
converts unused positional arguments to implicit slurpy list needs to
be careful to clear the C<.named> property on arguments so converted.
For instance, if you say

    push @array, 1, 2, :a<b>;

the compiler cannot know that the slurpy list starts at 1, so it markes
:a<b> as a named pair.  But that mark needs to be cleared, or

    say pop(@array);

will then think you said:

    say *pop(@array);

and treat :a<b> as a named argument to print, which is not what you want.

In any event, the named parameters need to be kept in the list until
bound.  an implementation that pulls named parameters out of the list
into a hash prematurely will lose the ordering of the push above,
for instance.

=head2 Invocant parameters

A method invocant is specified as the first parameter in the parameter
list, with a colon (rather than a comma) immediately after it:

    method get_name ($self:) {...}
    method set_name ($me: $newname) {...}

The corresponding argument (the invocant) is evaluated in scalar context
and is passed as the left operand of the method call operator:

    print $obj.get_name();
    $obj.set_name("Sam");

Multimethod and multisub invocants are specified at the start of the parameter
list, with a colon terminating the list of invocants:

    multi sub handle_event ($window, $event: $mode) {...}    # two invocants

Multi invocant arguments are passed positionally, though the first
invocant can be passed via the method call syntax if the multi happens
to be defined as a multi method within the class of the first invocant.

    # Multimethod calls...
    handle_event($w, $e, $m);
    $w.handle_event($e, $m);

Invocants may also be passed using the indirect object syntax, with a colon
after them. The colon is just a special form of the comma, and has the
same precedence:

    # Indirect method call...
    set_name $obj: "Sam";

    # Indirect multimethod call...
    handle_event $w, $e: $m;

Passing too many or too few invocants is a fatal error if no matching
definition can be found.

An invocant is the topic of the corresponding method or multi if that
formal parameter is declared with the name C<$_>.  A method's single
invocant always has the alias C<self>.  Other styles of self can be
declared with the C<self> pragma.


=head2 Required parameters

Required parameters are specified at the start of a subroutine's parameter
list:

    sub numcmp ($x, $y) { return $x <=> $y }

Required parameters may optionally be declared with a trailing C<!>,
though that's already the default for positional parameters:

    sub numcmp ($x!, $y!) { return $x <=> $y }

The corresponding arguments are evaluated in scalar context and may be
passed positionally or by name. To pass an argument by name,
specify it as a pair: C<< I<parameter_name> => I<argument_value> >>.

    $comparison = numcmp(2,7);
    $comparison = numcmp(x=>2, y=>7);
    $comparison = numcmp(y=>7, x=>2);

Pairs may also be passed in adverbial pair notation:

    $comparison = numcmp(:x(2), :y(7));
    $comparison = numcmp(:y(7), :x(2));

Passing the wrong number of required arguments to a normal subroutine
is a fatal error.  Passing a NamedArg that cannot be bound to a normal
subroutine is also a fatal error.  (Methods are different.)

The number of required parameters a subroutine has can be determined by
calling its C<.arity> method:

    $args_required = &foo.arity;


=head2 Optional parameters

Optional positional parameters are specified after all the required
parameters and each is marked with a C<?> after the parameter:

    sub my_substr ($str, $from?, $len?) {...}

Alternately, optional fields may be marked by supplying a default value.
The C<=> sign introduces a default value:

    sub my_substr ($str, $from = 0, $len = Inf) {...}

Default values can be calculated at run-time. They may even use the values of
preceding parameters:

    sub xml_tag ($tag, $endtag = matching_tag($tag) ) {...}

Arguments that correspond to optional parameters are evaluated in
scalar context. They can be omitted, passed positionally, or passed by
name:

    my_substr("foobar");            # $from is 0, $len is infinite
    my_substr("foobar",1);          # $from is 1, $len is infinite
    my_substr("foobar",1,3);        # $from is 1, $len is 3
    my_substr("foobar",len=>3);     # $from is 0, $len is 3

Missing optional arguments default to their default value, or to
an undefined value if they have no default.  (A supplied argument that is
undefined is not considered to be missing, and hence does not trigger
the default.  Use C<//=> within the body for that.)


=head2 Named parameters

Named-only parameters follow any required or optional parameters in the
signature. They are marked by a C<:>:

    sub formalize($text, :$case, :$justify) {...}

This is actually shorthand for:

    sub formalize($text, :case($case), :justify($justify)) {...}

Arguments that correspond to named parameters are evaluated in scalar
context. They can only be passed by name, so it doesn't matter what
order you pass them in, so long as they don't intermingle with any
positional arguments:

    $formal = formalize($title, case=>'upper');
    $formal = formalize($title, justify=>'left');
    $formal = formalize($title, :justify<right>, :case<title>);

Named parameters are optional unless marked with C<!>.  Default values for
optional named parameters are defined in the same way as for positional
parameters, but may depend only on the values of parameters that have
already been bound.  (Note that binding happens in the call order,
not declaration order.)  Named optional parameters default to C<undef> if they
have no default.  Named required parameters fail unless an argument pair
of that name is supplied.

Again, note the use of adverbial pairs in the argument list.  The following
table shows the correspondence:

    Fat arrow		Adverbial pair
    =========		==============
    a => 1		:a
    a => 0		:a(0)
    a => $x		:a($x)
    a => 'foo'		:a<foo>
    a => <foo bar>	:a<foo bar>
    a => «$foo @bar»	:a«$foo @bar»
    a => {...}		:a{...}
    a => [...]		:a[...]
    a => $a		:$a
    a => @a		:@a
    a => %a		:%a
    a => %foo<a>	%foo:<a>

=head2 List parameters

List parameters capture a variable length list of data. They're used
in subroutines like C<print>, where the number of arguments needs to be
flexible. They're also called "variadic parameters", because they take a
I<variable> number of arguments.  But generally we call them "slurpy"
parameters because they slurp up arguments.

Slurpy parameters follow any required or optional parameters. They are
marked by a C<*> before the parameter:

    sub duplicate($n, *%flag, *@data) {...}

Named arguments are bound to the slurpy hash (C<*%flag>
in the above example). Such arguments are evaluated in scalar context.
Any remaining variadic arguments at the end of the argument list
are bound to the slurpy array (C<*@data> above) and are evaluated
in list context.

For example:

    duplicate(3, reverse => 1, collate => 0, 2, 3, 5, 7, 11, 14);
    duplicate(3, :reverse, :collate(0), 2, 3, 5, 7, 11, 14);  # same

    # The @data parameter receives [2, 3, 5, 7, 11, 14]
    # The %flag parameter receives { reverse => 1, collate => 0 }

Slurpy scalar parameters capture what would otherwise be the first
elements of the variadic array:

    sub head(*$head, *@tail)         { return $head }
    sub neck(*$head, *$neck, *@tail) { return $neck }
    sub tail(*$head, *@tail)         { return @tail }

    head(1, 2, 3, 4, 5);        # $head parameter receives 1
                                # @tail parameter receives [2, 3, 4, 5]

    neck(1, 2, 3, 4, 5);        # $head parameter receives 1
                                # $neck parameter receives 2
                                # @tail parameter receives [3, 4, 5]

Slurpy scalars still impose list context on their arguments.

Slurpy parameters are treated lazily -- the list is only flattened
into an array when individual elements are actually accessed:

    @fromtwo = tail(1..Inf);        # @fromtwo contains a lazy [2..Inf]

You can't bind to the name of a slurpy parameter: the name is just there
so you can refer to it within the body. 

    sub foo(*%flag, *@data) {...}
    
    foo(:flag{ a => 1 }, :data[ 1, 2, 3 ]);
        # %flag has elements (flag => (a => 1)) and (data => [1,2,3])
        # @data has nothing

=head2 Slurpy block

It's also possible to declare a slurpy block: C<*&block>.  It slurps
up any nameless block, specified by C<{...}>, at either the current positional
location or the end of the syntactic list.  Put it first if you want the
option of putting a block either first or last in the arguments.  Put it
last if you want to force it to come in as the last argument.

=head2 Argument list binding

The underlying argument list (List) object may be bound to a single
scalar parameter marked with a C<\>:

    sub foo (\$args) { say $args.perl; &bar.call(*$args); }
    sub bar ($a,$b,$c,:$mice) { say $mice }

    foo 1,2,3,:mice<blind>;	# says "\(1,2,3,:mice<blind>)" then "blind"

It is allowed to specify a return type:

    sub foo (\$args --> Num) { ... }

Apart from that, no other parameters are allowed in the signature
after the List.  Parameters before the List either do not show up in
the List or are marked as already bound somehow.  In other words,
parameters are bound normally up to the List parameter, and then
C<\$args> takes a snapshot of the remaining input without further
attempts at binding.

=head2 Flattening argument lists

The unary prefix operator C<*> dereferences its operand (which allows
the elements of an array or iterator or List or Tuple to be used as
part of an argument list). The C<*> operator also causes its operand --
and any subsequent arguments in the argument list -- to be evaluated in
list context.  It also turns off syntactic recognition of named pairs.
The eventual argument list will be parsed at call time for named pairs.
All contiguous pairs are treated as named arguments until the first
non-Pair, and the rest of the arguments are considered slurpy args.
[XXX still underspecified...]


    sub foo($x, $y, $z) {...}    # expects three scalars
    @onetothree = 1..3;          # array stores three scalars

    foo(1,2,3);                  # okay:  three args found
    foo(@onetothree);            # error: only one arg
    foo(*@onetothree);           # okay:  @onetothree flattened to three args

The C<*> operator flattens lazily -- the array is flattened only if
flattening is actually required within the subroutine. To flatten before
the list is even passed into the subroutine, use the unary prefix C<**>
operator:

    foo(**@onetothree);          # array flattened before &foo called


=head2 Multidimensional argument list binding

Some functions take multiple Lists that they wish not to be flattened into
one list.  For instance, C<zip()> wants to iterate several lists in parallel,
while array and hash subscripts want to process multidimensional slices.
The set of underlying argument list (List) objects may be bound to a single
array parameter declared with a C<;> twigil:

    sub foo (*@;slices) { ... }

It is allowed to specify a return type:

    sub foo (*@;slices --> Num) { ... }

=head2 Pipe operators

The variadic array of a subroutine call can be passed in separately
from the normal argument list, by using either of the "pipe" operators:
C<< <== >> or C<< ==> >>.

Each operator expects to find a call to a variadic receiver on its
"sharp" end, and a list of values on its "blunt" end:

    grep { $_ % 2 } <== @data;

    @data ==> grep { $_ % 2 };

It binds the (potentially lazy) list from the blunt end to the slurpy
parameter(s) of the receiver on the sharp end.  In the case of a receiver
that is a variadic function, the pipe is received as part of its slurpy list.
So both of the calls above are equivalent to:

    grep { $_ % 2 } @data;

Leftward pipes are a convenient way of explicitly indicating the typical
right-to-left flow of data through a chain of operations:

    @oddsquares = map { $_**2 }, sort grep { $_ % 2 }, @nums;

    # more clearly written as...

    @oddsquares = map { $_**2 } <== sort <== grep { $_ % 2 } <== @nums;

Rightward pipes are a convenient way of reversing the normal data flow in a
chain of operations, to make it read left-to-right:

    @oddsquares =
            (@nums ==> grep { $_ % 2 } ==> sort ==> map { $_**2 });

Note that the parens are necessary there due to precedence.

If the operand on the sharp end of a pipe is not a call to a variadic
operation, it must be something else that can be interpreted as a
list receiver.

You may use a variable (or variable declaration) as a receiver, in
which case the list value is bound as the "todo" of the variable.
Do not think of it as an assignment, nor as an ordinary binding.
Think of it as iterator creation.  In the case of a scalar variable,
that variable contains the newly created iterator itself.  In the case
of an array, the new iterator is installed as the method for extending
the array.  Unlike with assignment, no clobbering of the array is implied.
It's therefore more like a push than an assignment.

In general you can simply think of a receiver array as representing
the results of the pipeline, so you can equivalently write any of:

    my @oddsquares <== map { $_**2 } <== sort <== grep { $_ % 2 } <== @nums;

    my @oddsquares
    	<== map { $_**2 }
	<== sort
	<== grep { $_ % 2 }
	<== @nums;

    @nums ==> grep { $_ % 2 } ==> sort ==> map { $_**2 } ==> my @oddsquares;

    @nums
    ==> grep { $_ % 2 }
    ==> sort
    ==> map { $_**2 }
    ==> my @oddsquares;

Since the pipe iterator is bound into the final variable, the variable
can be just as lazy as the pipe that is producing the values.

Because pipes are bound to arrays with "push" semantics, you can have
a receiver for multiple pipes:

    my @foo;
    0..2       ==> @foo;
    'a'..'c'   ==> @foo;
    say @foo;	# 0,1,2,'a','b','c'

Note how the pipes are concatenated in C<@foo> so that C<@foo>
is a list of 6 elements.  This is the default behavior.  However,
sometimes you want to capture the outputs as a list of two iterators,
namely the two iterators that represent the two input pipes.  You can
get at those two iterators by using the name C<@;foo> instead, where
the "pipe" twigil marks a multidimensional array, that is, an
array of slices.

    0...       ==> @;foo;
    'a'...     ==> @;foo;
    pidigits() ==> @;foo;

    for zip(@;foo) { say }

	[0,'a',3]
	[1,'b',1]
	[2,'c',4]
	[3,'d',1]
	[4,'e',5]
	[5,'f',9]
	...

Here C<@;foo> is an array of three iterators, so

    zip(@;foo)

is equivalent to

    zip(@;foo[0]; @;foo[1]; @;foo[2])

A semicolon inside brackets is equivalent to stacked pipes.  The code above
could be rewritten as:

    (0...; 'a'...; pidigits()) ==> my @;foo;
    for @;foo.zip { say }

which is in turn equivalent to

    for zip(0...; 'a'...; pidigits()) { say }

A named receiver array is useful when you wish to pipe into an
expression that is not an ordinary list operator, and you wish to be
clear where the pipe's destination is supposed to be:

    picklist() ==> my @baz;
    my @foo = @bar[@baz];

Various contexts may or may not be expecting multi-dimensional slices
or pipes.  By default, ordinary arrays are flattened, that is, they
have "cat" semantics.  If you say

    (0..2; 'a'..'c') ==> my @tmp;
    for @tmp { say }

then you get 0,1,2,'a','b','c'.  If you have a multidim array, you
can ask for cat semantics explicitly with cat():

    (0..2; 'a'..'c') ==> my @;tmp;
    for @;tmp.cat { say }

As we saw earlier, "zip" produces little arrays by taking one element
from each list in turn, so

    (0..2; 'a'..'c') ==> my @;tmp;
    for @;tmp.zip { say }

produces [0,'a'],[1,'b'],[2,'c'].  If you don't want the subarrays, then
use C<each()> instead:

    (0..2; 'a'..'c') ==> my @;tmp;
    for @;tmp.each { say }

and then you just get 0,'a',1,'b',2,'c'.  This is good for

    for @;tmp.each -> $i, $a { say "$i: $a" }

In list context the C<@;foo> notation is really a shorthand for C<[;](@;foo)>.

Every lexical scope gets its own implicitly declared C<@;> variable,
which is the default receiver.  So instead of using C<@;foo> above
you can just say

    0...       ==> ;
    'a'...     ==> ;
    pidigits() ==> ;

    for zip(@;) { say }

Note that with the current definition, the order of pipes is preserved
left to right in general regardless of the position of the receiver.

So

    ('a'...; 0...) ==> ;
     for zip(@; <== @foo) -> [$a, $i, $x] { ...}

is the same as

    'a'... ==> ;
     0...  ==> ;
     for zip(@; <== @foo) -> [$a, $i, $x] { ...}

which is the same as

    for zip('a'...; 0...; @foo) -> [$a, $i, $x] { ...}

And

    @foo ==> ;
    0... ==> ;
    for each(@;) -> $x, $i { ...}

is the same as

    0... ==> ;
    for each(@foo; @;) -> $x, $i { ...}

which is the same as

    for each(@foo; 0...) -> $x, $i { ...}

Note that the each method is also sensitive to multislicing, so you
could also just write that as:

    (@foo; 0...).each: -> $x, $i { ...}

Also note that these come out to identical for ordinary arrays:

    @foo.each
    @foo.cat

=head2 Closure parameters

Parameters declared with the C<&> sigil take blocks, closures, or
subroutines as their arguments. Closure parameters can be required,
optional, named, or slurpy.

    sub limited_grep (Int $count, &block, *@list) {...}

    # and later...

    @first_three = limited_grep 3, {$_<10}, @data;

Within the subroutine, the closure parameter can be used like any other
lexically scoped subroutine:

    sub limited_grep (Int $count, &block, *@list) {
        ...
        if block($nextelem) {...}
        ...
    }

The closure parameter can have its own signature in a type specification written
with C<:(...)>:

    sub limited_Dog_grep ($count, &block:(Dog), Dog *@list) {...}

and even a return type:

    sub limited_Dog_grep ($count, &block:(Dog --> Bool), Dog *@list) {...}

When an argument is passed to a closure parameter that has this kind of
signature, the argument must be a C<Code> object with a compatible
parameter list and return type.

=head2 Type parameters

Unlike normal parameters, type parameters often come in piggybacked
on the actual value as "kind", and you'd like a way to capture both
the value and its kind at once.  (A "kind" is a class or type that
an object is allowed to be.  An object is not officially allowed
to take on a constrained or contravariant type.)  A type variable
can be used anywhere a type name can, but instead of asserting that
the value must conform to a particular type, instead captures the
actual "kind" of object and also declares a package/type name
by which you can refer to that kind later in the signature or body.
For instance, if you wanted to match any two Dogs as long as they
were of the same kind, you can say:

    sub matchedset (Dog ::T $fido, T $spot) {...}

(Note that C<::T> is not required to contain C<Dog>, only
a type that is compatible with C<Dog>.)

The C<::> sigil is short for "subset" in much the same way that C<&> is
short for "sub".  Just as C<&> can be used to name any kind of code,
so too C<::> can be used to name any kind of type.  Both of them insert
a bare identifier into the grammar, though they fill different syntactic
spots.

Note that it is not required to capture the object associated with the
class unless you want it.  The sub above could be written

    sub matchedset (Dog ::T, T) {...}

if we're not interested in C<$fido> or C<$spot>.  Or just 

    sub matchedset (::T, T) {...}

if we don't care about anything but the matching.

=head2 Unpacking array parameters

Instead of specifying an array parameter as an array:

    sub quicksort (@data, ?$reverse, ?$inplace) {
        my $pivot := shift @data;
        ...
    }

it may be broken up into components in the signature, by
specifying the parameter as if it were an anonymous array of
parameters:

    sub quicksort ([$pivot, *@data], ?$reverse, ?$inplace) {
        ...
    }

This subroutine still expects an array as its first argument, just like
the first version.

=head2 Unpacking a single list argument

To match the first element of the slurpy list, use a "slurpy" scalar:

    sub quicksort (:$reverse, :$inplace, *$pivot, *@data)

=head2 Unpacking hash parameters

Likewise, a hash argument can be mapped to a hash of parameters, specified
as named parameters within curlies.  Instead of saying:

    sub register (%guest_data, $room_num) {
        my $name := delete %guest_data<name>;
        my $addr := delete %guest_data<addr>;
        ...
    }
                                                                                
you can get the same effect with:
                                                                                
    sub register ({:$name, :$addr, *%guest_data}, $room_num) {
        ...
    }

=head2 Unpacking tree node parameters

You can unpack tree nodes in various dwimmy ways by enclosing the bindings
of child nodes and attributes in parentheses following the declaration of
the node itself

    sub traverse ( BinTree $top ( $left, $right ) ) {
	traverse($left);
	traverse($right);
    }

In this, C<$left> and C<$right> are automatically bound to the left
and right nodes of the tree.  If $top is an ordinary object, it binds
the C<$top.left> and C<$top.right> attributes.  If it's a hash,
it binds C<< $top<left> >> and C<< $top<right> >>.  If C<BinTree> is a
signature type and $top is a List (argument list) object, the child types
of the signature are applied to the actual arguments in the argument
list object.  (Signature types have the benefit that you can view
them inside-out as constructors with positional arguments, such that
the transformations can be reversible.)

However, the full power of signatures can be applied to pattern match
just about any argument or set of arguments, even though in some cases
the reverse transformation is not intuitable.  For instance, to bind to
an array of children named C<.kids> or C<< .<kids> >>, use something
like:

    sub traverse ( NAry $top ( :kids [$eldest, *@siblings] ) ) {
	traverse($eldest);
	traverse(@siblings);
    }

Likewise, to bind to a hash element of the node and then bind to
keys in that hash by name:

    sub traverse ( AttrNode $top ( :%attr{ :$vocalic, :$tense } ) {
	say "Has {+%attr} attributes, of which";
	say "vocalic = $vocalic";
	say "tense = $tense";
    }

You may omit the top variable if you prefix the parentheses with a colon
to indicate a signature.  Otherwise you must at least put the sigil of
the variable, or we can't correctly differentiate:

    my Dog ($fido, $spot) = twodogs();		# list of two dogs
    my Dog $ ($fido, $spot) := twodogs();	# one twodog object
    my Dog :($fido, $spot) := twodogs();	# one twodog object

Subsignatures can be matched directly with rules by using C<:(...)>
notation.

    push @a, "foo";
    push @a, \(1,2,3);
    push @a, "bar";
    ...
    my ($i, $j, $k);
    @a ~~ rx/
	    <,>				# match initial elem boundary
	    :(Int $i,Int $j,Int? $k)	# match tuple with 2 or 3 ints
	    <,>				# match final elem boundary
	  /;
    say "i = $<i>";
    say "j = $<j>";
    say "k = $<k>" if defined $<k>;

If you want a parameter bound into C<$/>, you have to say C<< $<i> >>
within the signature.  Otherwise it will try to bind an external C<$i>
instead, and fail if no such variable is declared.

Note that unlike a sub declaration, a rule-embedded signature has no
associated "returns" syntactic slot, so you have to use C<< --> >>
within the signature to specify the type of the tuple, or match as
an arglist:

    :(Num, Num --> Coord)
    :(\Coord(Num, Num))

A consequence of the latter form is that you can match the type of
an object with C<:(\Dog)> without actually breaking it into its components.
Note, however, that it's not equivalent to say

    :(--> Dog)

which would be equivalent to

    :(\Dog())

that is, match a null tuple of type C<Dog>.  Nor is it equivalent to

    :(Dog)

which would be equivalent to

    :(\Any(Dog))

or

    :([Dog])

and match a tuple-ish item with a single value of type Dog.

Note also that bare C<\(1,2,3)> is never legal in a rule since the
first paren would try to match literally.

=head2 Attributive parameters

If a submethod's parameter is declared with a C<.> or C<!> after the
sigil (like an attribute):

    submethod initialize($.name, $!age) {}

then the argument is assigned directly to the object's attribute of the
same name. This avoids the frequent need to write code like:

    submethod initialize($name, $age) {
        $.name = $name;
        $!age  = $age;
    }

To rename an attribute parameter you can use the explicit pair form:

    submethod initialize(:moniker($.name), :youth($!age)) {}

The C<:$name> shortcut may be combined with the C<$.name> shortcut,
but the twigil is ignored for the parameter name, so

    submethod initialize(:$.name, :$!age) {}

is the same as:

    submethod initialize(:name($.name), :age($!age)) {}

Note that C<$!age> actually refers to the private "C<has>" variable that
can be referred to either as C<$age> or C<$!age>.

=head2 Placeholder variables

Even though every bare block is a closure, bare blocks can't have
explicit parameter lists. Instead, they use "placeholder" variables,
marked by a caret (C<^>) after their sigils.

Using placeholders in a block defines an implicit parameter list. The
signature is the list of distinct placeholder names, sorted in Unicode order.
So:

    { $^y < $^z && $^x != 2 }

is a shorthand for:

    -> $x,$y,$z { $y < $z && $x != 2 }

Note that placeholder variables syntactically cannot have type constraints.

=head1 Types

These are some of the standard type names in Perl 6 (at least this week):

    bit         single native bit
    int         native integer
    buf         native 8-bit string (sequence of 8-bit integers, no Unicode)
    str         native string (sequence of arbitrary integers, no Unicode)
    num         native floating point
    complex	native complex number
    ref         native pointer 
    bool        native boolean
    Bit         Perl single bit (allows traits, aliasing, undef, etc.)
    Int         Perl integer (allows traits, aliasing, undef, etc.)
    Str         Perl string (Unicode semantics)
    Num         Perl number
    Complex     Perl complex number
    Ref         Perl reference
    Bool        Perl boolean
    Array       Perl array
    Hash        Perl hash
    IO          Perl filehandle
    Code        Base class for all executable objects
    Routine     Base class for all nameable executable objects
    Sub         Perl subroutine
    Method      Perl method
    Submethod   Perl subroutine acting like a method
    Macro       Perl compile-time subroutine
    Rule        Perl pattern
    Block       Base class for all embedded executable objects
    Package     Perl 5 compatible namespace
    Module      Perl 6 standard namespace
    Class       Perl 6 standard class namespace
    Role        Perl 6 standard generic interface/implementation
    Object      Perl 6 object
    Grammar     Perl 6 pattern matching namespace
    List        Lazy Perl list
    Tuple       Completely evaluated (hence immutable) list


=head2 Value types

Explicit types are optional. Perl variables have two associated types:
their "value type" and their "implementation type".  (More generally, any
container has an implementation type, including subroutines and modules.)

The value type specifies what kinds of values may be stored in the
variable. A value type is given as a prefix or with the C<returns> or
C<of> keywords:

    my Dog $spot;
    my $spot returns Dog;
    my $spot of Dog;

    our Animal sub get_pet() {...}
    sub get_pet() returns Animal {...}
    sub get_pet() of Animal {...}

A value type on an array or hash specifies the type stored by each element:

    my Dog @pound;  # each element of the array stores a Dog

    my Rat %ship;   # the value of each entry stores a Rat

The key type of a hash may be specified as a shape trait--see S9.

=head2 Implementation types

The implementation type specifies how the variable itself is implemented. It is
given as a trait of the variable:

    my $spot is Scalar;             # this is the default
    my $spot is PersistentScalar;
    my $spot is DataBase;

Defining an implementation type is the Perl 6 equivalent to tying
a variable in Perl 5.  But Perl 6 variables are tied directly at
declaration time, and for performance reasons may not be tied with a
run-time C<tie> statement unless the variable is explicitly declared
with an implementation type that does the C<Tieable> role.

=head2 Hierarchical types

A non-scalar type may be qualified, in order to specify what type of
value each of its elements stores:

    my Egg $cup;                       # the value is an Egg
    my Egg @carton;                    # each elem is an Egg
    my Array of Egg @box;              # each elem is an array of Eggs
    my Array of Array of Egg @crate;   # each elem is an array of arrays of Eggs
    my Hash of Array of Recipe %book;  # each value is a hash of arrays of Recipes

Each successive C<of> makes the type on its right a parameter of the
type on its left. Parametric types are named using square brackets, so:

    my Hash of Array of Recipe %book;

actually means:

    my Hash[returns => Array[returns => Recipe]] %book; 

Because the actual variable can be hard to find when complex types are
specified, there is a postfix form as well:

    my Hash of Array of Recipe %book;           # HoHoAoRecipe
    my %book of Hash of Array of Recipe;        # same thing
    my %book returns Hash of Array of Recipe;   # same thing

The C<returns> form is more commonly seen in subroutines:

    my Hash of Array of Recipe sub get_book ($key) {...}
    my sub get_book ($key) of Hash of Array of Recipe {...}
    my sub get_book ($key) returns Hash of Array of Recipe {...}

Alternately, the return type may be specified within the signature:

    my sub get_book ($key --> Hash of Array of Recipe) {...}

There is a slight difference, insofar as the type inferencer will
ignore a C<returns> but pay attention to C<< --> >> declarations.
Only the inside of the subroutine pays attention to C<returns>.

=head2 Polymorphic types

Anywhere you can use a single type you can use a set of types, for convenience
specifiable as if it were an "or" junction:

    my Int|Str $error = $val;              # can assign if $val~~Int or $val~~Str

Fancier type constrains may be expressed through a subtype:

    subset Shinola of Any where {.does(DessertWax) and .does(FloorTopping)};
    if $shimmer ~~ Shinola {...}  # $shimmer must do both interfaces

Since the terms in a parameter could be viewed as a set of
contraints that are implicitly "anded" together (the variable itself
supplies type constraints, and where clauses or tree matching just
add more constraints), we relax this to allow juxtaposition of
anded types:

    my Cat|Dog Fish $mitsy = new Fish but { int rand 2 ?? .does Cat;
						       !! .does Dog };

=head2 Parameter types

Parameters may be given types, just like any other variable:

    sub max (int @array is rw) {...}
    sub max (@array of int is rw) {...}

=head2 Generic types

Within a declaration, a class variable (either by itself or
following an existing type name) declares a new type name and takes
its parametric value from the actual type of the parameter it is
associated with.  It declares the new type name in whatever scope
the surrounding declaration is associated lexical scope.

    sub max (Num ::X @array ) {
	push @array, X.new();
    }

The new type name is introduced immediately, so two such types in
the same signature must unify compatibly if they have the same name:

    sub compare (Any ::T $x, T $y) {
	return $x eqv $y;
    }

=head2 Return types

On a scoped subroutine, a return type can be specified before or
after the name:

    our Egg sub lay {...}
    our sub lay returns Egg {...}

    my Rabbit sub hat {...}
    my sub hat returns Rabbit {...}

If a subroutine is not explicitly scoped, it belongs to the current
namespace (module, class, grammar, or package). Any return type must go
after the name:

    sub lay returns Egg {...}

On an anonymous subroutine, any return type can only go after the C<sub>
keyword:

    $lay = sub returns Egg {...};

unless you use the "anonymous declarator" (C<a>/C<an>):

    $lay = an Egg sub {...};
    $hat = a Rabbit sub {...};

The return type may also be specified after a C<< --> >> token within the
signature.  This doesn't mean exactly the same thing as C<returns>.  The
arrow form is an "official" return type, and may be used to do type
inferencing outside the sub.  The C<returns> form only makes the return
type available to the internals of the sub so that the C<return> statement
can know its context, but outside the sub it just we don't know anything
about the return value, as if no return type had been declared.  The prefix
form actually corresponds to the C<< --> >> semantics rather than the
C<returns> semantics, so the return type of

    my Fish sub wanda ($x) { ... }

is known to return an object of type Fish, as if you'd said:

    my sub wanda ($x --> Fish) { ... }

not as if you'd said

    my sub wanda ($x) returns Fish { ... }

It is possible for the outer type to disagree with the outside type:

    my Squid sub wanda ($x) returns Fish { ... }

or equivalently,

    my sub wanda ($x --> Squid) returns Fish { ... }

It's not clear why you'd want to lie to yourself like that, though.

=head1 Properties and traits

Compile-time properties are called "traits". The 
C<is I<NAME> (I<DATA>)> syntax defines traits on containers and
subroutines, as part of their declaration:

    my $pi is constant = 3;

    my $key is Persistent(:file<.key>);

    sub fib is cached {...}

The C<will I<NAME> I<BLOCK>> syntax is a synonym for C<is I<NAME> (I<BLOCK>)>:

    my $fh will undo { close $fh };    # Same as: my $fh is undo({ close $fh });

The C<but I<NAME> (I<DATA>)> syntax specifies run-time properties on values:

    my $pi = 3 but Approximate("legislated");

    sub system {
        ...
        return $error but false if $error;
        return 0 but true;
    }

Properties are predeclared as roles and implemented as mixins--see A12.

=head2 Subroutine traits

These traits may be declared on the subroutine as a whole (individual
parameters take other traits).

=over 

=item C<is signature>

The signature of a subroutine. Normally declared implicitly, by providing a
parameter list and/or return type.

=item C<returns>/C<is returns>

The type returned by a subroutine.

=item C<will do>

The block of code executed when the subroutine is called. Normally declared
implicitly, by providing a block after the subroutine's signature definition.

=item C<is rw>

Marks a subroutine as returning an lvalue.

=item C<is parsed>

Specifies the rule by which a macro call is parsed.

=item C<is cached>

Marks a subroutine as being memoized.

=item C<is inline>

I<Suggests> to the compiler that the subroutine is a candidate for
optimization via inlining.

=item C<is tighter>/C<is looser>/C<is equiv>

Specifies the precedence of an operator relative to an existing
operator.  C<equiv> also specifies the default associativity to
be the same as the operator to which the new operator is equivalent.
C<tighter> and C<looser> operators default to left associative.

=item C<is assoc>

Specifies the associativity of an operator explicitly.  Valid values are:

    Tag		Examples	Meaning of $a op $b op $c
    ===		========	=========================
    left	+ - * / x	($a op $b) op $c
    right	** =		$a op ($b op $c)
    non		cmp <=> ..	ILLEGAL
    chain	== eq ~~	($a op $b) and ($b op $c)
    list	| & ^ ¥		listop($a, $b, $c) or listop($a; $b; $c)


Note that operators "C<equiv>" to relationals are automatically considered
chaining operators.  When creating a new precedence level, the chaining
is determined by by the presence or absence of "C<is assoc('chaining')>",
and other operators defined at that level are required to be the same.

=item C<PRE>/C<POST>

Mark blocks that are to be unconditionally executed before/after
the subroutine's C<do> block. These blocks must return a true value,
otherwise an exception is thrown.

=item C<FIRST>/C<LAST>/C<NEXT>/C<KEEP>/C<UNDO>/etc.

Mark blocks that are to be conditionally executed before or after
the subroutine's C<do> block. These blocks are generally used only for
their side effects, since most return values will be ignored.  C<FIRST>
may be an exception, but in that case you probably want to use a
state variable anyway.

=back


=head2 Parameter traits

The following traits can be applied to many types of parameters.

=over 

=item C<is readonly>

Specifies that the parameter cannot be modified (e.g. assigned to,
incremented). It is the default for parameters.

=item C<is rw>

Specifies that the parameter can be modified (assigned to, incremented,
etc). Requires that the corresponding argument is an lvalue or can be
converted to one.

When applied to a variadic parameter, the C<rw> trait applies to each
element of the list:

    sub incr (*@vars is rw) { $_++ for @vars }

(The variadic array as a whole is always modifiable, but such
modifications have no effect on the original argument list.)

=item C<is ref>

Specifies that the parameter is passed by reference. Unlike C<is rw>, the
corresponding argument must already be a suitable lvalue. No attempt at
coercion or autovivification is made, so unsuitable values throw an
exception when you try to modify them.

=item C<is copy>

Specifies that the parameter receives a distinct, read-writeable copy of the
original argument. This is commonly known as "pass-by-value".

    sub reprint ($text, $count is copy) {
        print $text while $count-- > 0;
    }

=item C<is context(I<TYPE>)>

Specifies the context that a parameter applies to its argument. Typically used
to cause a final list parameter to apply a series of scalar contexts:

    # &format may have as many arguments as it likes,
    # each of which is evaluated in scalar context

    sub format(*@data is context(Scalar)) {...}

Note that the compiler may not be able to propagate such a scalar
context to a function call used as a parameter to a method or multisub
whose signature is not visible until dispatch time.  Such function
call parameters are called in list context by default, and must be
coerced to scalar context explicitly if that is desired.

=back


=head1 Advanced subroutine features


=head2 The C<caller> function

The C<caller> function returns an object that describes a particular 
"higher" dynamic scope, from which the current scope was called.

    print "In ",           caller.sub,
          " called from ", caller.file,
          " line ",        caller.line,
          "\n";

C<caller> may be given arguments telling it what kind of higher scope to
look for, and how many such scopes to skip over when looking:

    $caller = caller;                      # immediate caller
    $caller = caller Method;               # nearest caller that is method
    $caller = caller Bare;                 # nearest caller that is bare block
    $caller = caller Sub, :skip(2);        # caller three levels up
    $caller = caller Block, :label<Foo>;   # caller whose label is 'Foo'

=head2 The C<want> function

The C<want> function returns an object that contains information about
the context in which the current block, closure, or subroutine was
called.

The returned context object is typically tested with a smart match (C<~~>)
or a C<when>:

   given want {
        when Scalar {...}           # called in scalar context
        when List   {...}           # called in list context
        when Lvalue {...}           # expected to return an lvalue
        when 2      {...}           # expected to return two values
        ...
    }

or has the corresponding methods called on it:

       if (want.Scalar)    {...}    # called in scalar context
    elsif (want.List)      {...}    # called in list context
    elsif (want.rw)        {...}    # expected to return an lvalue
    elsif (want.count > 2) {...}    # expected to return more than two values

Note these are pseudo type associations.  There's no such thing as an
Lvalue object, and a List is really an unbound argument list object,
parts of which may in fact be eventually bound into scalar context.

=head2 The C<leave> function

A C<return> statement causes the innermost surrounding subroutine, method,
rule, macro, or multimethod to return.  Only declarations with an explicit
keyword such as "sub" may be returned from.

To return from other types of code structures, the C<leave> function is used:

    leave;                      # return from innermost block of any kind
    leave Method;               # return from innermost calling method
    leave &?SUB <== 1,2,3;      # Return from current sub. Same as: return 1,2,3
    leave &foo <== 1,2,3;       # Return from innermost surrounding call to &foo
    leave Loop, :label<COUNT>;  # Same as: last COUNT;


=head2 Temporization

The C<temp> function temporarily replaces the value of an existing
variable, subroutine, or other object in a given scope:

    {
       temp $*foo = 'foo';      # Temporarily replace global $foo
       temp &bar = sub {...};   # Temporarily replace sub &bar
       ...
    } # Old values of $*foo and &bar reinstated at this point

C<temp> invokes its argument's C<.TEMP> method. The method is expected
to return a reference to a subroutine that can later restore the current
value of the object. At the end of the lexical scope in which the
C<temp> was applied, the subroutine returned by the C<.TEMP> method is
executed.

The default C<.TEMP> method for variables simply creates
a closure that assigns the variable's pre-C<temp> value 
back to the variable.

New kinds of temporization can be created by writing storage classes with
their own C<.TEMP> methods:

    class LoudArray is Array {
        method TEMP {
            print "Replacing $_.id() at $(caller.location)\n";
            my $restorer = .SUPER::TEMP();
            return { 
                print "Restoring $_.id() at $(caller.location)\n";
                $restorer();
            };
        }
    }

You can also modify the behaviour of temporized code structures, by
giving them a C<TEMP> block. As with C<.TEMP> methods, this block is
expected to return a closure, which will be executed at the end of
the temporizing scope to restore the subroutine to its pre-C<temp> state:

    my $next = 0;
    sub next {
        my $curr = $next++;
        TEMP {{ $next = $curr }}  # TEMP block returns the closure { $next = $curr }
        return $curr;
    }

    # and later...
									    
    say next();     # prints 0; $next == 1
    say next();     # prints 1; $next == 2
    say next();     # prints 2; $next == 3
    if ($hiccough) {
	say temp next();  # prints 3; closes $curr at 3; $next == 4
	say next();    	  # prints 4; $next == 5
	say next();       # prints 5; $next == 6
    }                     # $next = 3
    say next();     # prints 3; $next == 4
    say next();     # prints 4; $next == 5

Hypothetical variables use the same mechanism, except that the restoring
closure is called only on failure.

Note that "env" variables may be a better solution than temporized
globals in the face of multithreading.

=head2 Wrapping

Every subroutine has a C<.wrap> method. This method expects a single
argument consisting of a block, closure, or subroutine. That argument
must contain a call to the special C<call> function:

    sub thermo ($t) {...}   # set temperature in Celsius, returns old temp

    # Add a wrapper to convert from Fahrenheit...

    $id = &thermo.wrap( { call( ($^t-32)/1.8 ) } );

The call to C<.wrap> replaces the original subroutine with the closure
argument, and arranges that the closure's call to C<call> invokes the
original (unwrapped) version of the subroutine. In other words, the call to
C<.wrap> has more or less the same effect as:

    &old_thermo := &thermo;
    &thermo := sub ($t) { old_thermo( ($t-32)/1.8 ) }

The call to C<.wrap> returns a unique identifier that can later be passed to
the C<.unwrap> method, to undo the wrapping:

    &thermo.unwrap($id);

A wrapping can also be restricted to a particular dynamic scope with
temporization:

    # Add a wrapper to convert from Kelvin
    # wrapper self-unwraps at end of current scope

    temp &thermo.wrap( { call($^t + 273.16) } );

Within a wrapper, the C<&_> variable is implicitly declared as a
lexical by the wrapper, and refers to the function that C<call>
implicitly calls.  Thus, for non-wrappers, you may also declare
your own C<&_> lexical variable (or parameter) and then use C<call>
to call whatever is referenced by C<&_>.  (In the absence of such
a declaration, C<call> magically steals the dispatch list from the
current dispatcher, and redispatches to the next-most-likely method
or multi-sub.)

The entire unprocessed argument List can be captured by a C<\$args> parameter.
It can then be passed to C<call> as C<*$args>.

=head2 The C<&?SUB> routine

C<&?SUB> is always an alias for the current subroutine, so you can
specify tail-recursion on an anonymous sub:

    my $anonfactorial = sub (Int $n) {
                            return 1 if $n<2;
                            return $n * &?SUB($n-1);
                        };

C<$?SUBNAME> contains the name of the current subroutine, if any.

Note that C<&?SUB> refers to the current single sub, even if it is
declared "multi".  To redispatch to the entire suite under a given short
name, just use the named form, since there are no anonymous multis.

=head2 The C<&?BLOCK> routine

C<&?BLOCK> is always an alias for the current block, so you can
specify tail-recursion on an anonymous block:

    my $anonfactorial = -> Int $n { $n < 2
    					?? 1
					:: $n * &?BLOCK($n-1)
				  };

C<$?BLOCKLABEL> contains the label of the current block, if any.

[Note: to refer to any C<$?> or C<&?> variable at the time the sub or
block is being compiled, use the C<< COMPILING:: >> pseudopackage.]

=head2 Currying

Every subroutine has an C<.assuming> method. This method does a partial
binding of a set of arguments to a signature and returns a new function
that takes only the remaining arguments.

    &textfrom := &substr.assuming(str=>$text, len=>Inf);

or equivalently:

    &textfrom := &substr.assuming(:str($text) :len(Inf));

or even:

    &textfrom := &substr.assuming:str($text):len(Inf);

It returns a reference to a subroutine that implements the same behaviour
as the original subroutine, but has the values passed to C<.assuming>
already bound to the corresponding parameters:

    $all  = $textfrom(0);   # same as: $all  = substr($text,0,Inf);
    $some = $textfrom(50);  # same as: $some = substr($text,50,Inf);
    $last = $textfrom(-1);  # same as: $last = substr($text,-1,Inf);

The result of a C<use> statement is a (compile-time) object that also has
an C<.assuming> method, allowing the user to bind parameters in all the
module's subroutines/methods/etc. simultaneously:

    (use IO::Logging).assuming(logfile => ".log");

This form should generally be restricted to named parameters.

To curry a particular multimethod it may be necessary to specify the type
of one or more of its invocants:

    &woof ::= &bark:(Dog).assuming :pitch<low>;
    &pine ::= &bark:(Tree).assuming :pitch<yes>;


=head1 Other matters


=head2 Anonymous hashes vs blocks

C<{...}> is always a block.  However, if it is completely empty or
consists of a single list, the first element of which is either a hash
or a pair, it is executed immediately to compose a hash reference.  

The standard C<pair> list operator is equivalent to:

    sub pair (*@LIST) {
        my @pairs;
        for @LIST -> $key, $val {
            push @pairs, $key => $val;
        }
        return @pairs;
    }

or more succinctly (and lazily):

    sub pair (*@LIST) {
        gather {
	    for @LIST -> $key, $val {
		take $key => $val;
	    }
	}
    }

The standard C<hash> list operator is equivalent to:

    sub hash (*@LIST) {
	return { pair @LIST };
    }

So you may use C<sub> or C<hash> or C<pair> to disambiguate:

    $ref =  sub { 1, 2, 3, 4, 5, 6 };   # Anonymous sub returning list
    $ref =      { 1, 2, 3, 4, 5, 6 };   # Anonymous sub returning list
    $ref =      { 1=>2, 3=>4, 5=>6 };   # Anonymous hash
    $ref =      { 1=>2, 3, 4, 5, 6 };   # Anonymous hash
    $ref =  hash( 1, 2, 3, 4, 5, 6 );   # Anonymous hash
    $ref =  hash  1, 2, 3, 4, 5, 6  ;   # Anonymous hash
    $ref = { pair 1, 2, 3, 4, 5, 6 };   # Anonymous hash


=head2 Pairs as lvalues

Pairs can be used as lvalues. The value of the pair is the recipient of
the assignment:

    (key => $var) = "value";

When binding pairs, names can be used to "match up" lvalues and rvalues,
provided you write hte left side as a signature using C<:(...)> notation:

    :(:who($name), :why($reason)) := (why => $because, who => "me");

(Otherwise the parser doesn't know it should parse the insides as a
signature and not as an ordinary expression until it gets to the C<:=>,
and that would be bad.  Possibly we should require a "C<my>" out front
as well...)

=head2 Out-of-scope names

C<< GLOBAL::<$varname> >> specifies the C<$varname> declared in the C<*>
namespace.  Or maybe it's the other way around...

C<< CALLER::<$varname> >> specifies the C<$varname> visible in
the dynamic scope from which the current block/closure/subroutine
was called, provided that variable is declared with the "C<env>"
declarator.  (Implicit lexicals such as C<$_> are automatically
assumed to be environmental.)

C<< ENV::<$varname> >> specifies the C<$varname> visible in the
innermost dynamic scope that declares the variable with the "C<env>"
declarator.

C<< MY::<$varname> >> specifies the lexical C<$varname> declared in the current
lexical scope.

C<< OUR::<$varname> >> specifies the C<$varname> declared in the current
package's namespace.

C<< COMPILING::<$varname> >> specifies the C<$varname> declared (or about
to be declared) in the lexical scope currently being compiled.

C<< OUTER::<$varname> >> specifies the C<$varname> declared in the lexical
scope surrounding the current lexical scope (i.e. the scope in which
the current block was defined).
