[prev in list] [next in list] [prev in thread] [next in thread] 

List:       perl6-language
Subject:    r27313 - docs/Perl6/Spec
From:       pugs-commits () feather ! perl6 ! nl
Date:       2009-06-30 1:58:33
Message-ID: 20090630015833.14969.qmail () feather ! perl6 ! nl
[Download RAW message or body]

Author: lwall
Date: 2009-06-30 03:58:33 +0200 (Tue, 30 Jun 2009)
New Revision: 27313

Modified:
   docs/Perl6/Spec/S03-operators.pod
   docs/Perl6/Spec/S12-objects.pod
Log:
[S03] make constant have "our" scoping
[S12] attempt to spec irc conversation with jnthn++


Modified: docs/Perl6/Spec/S03-operators.pod
===================================================================
--- docs/Perl6/Spec/S03-operators.pod	2009-06-29 23:44:51 UTC (rev 27312)
+++ docs/Perl6/Spec/S03-operators.pod	2009-06-30 01:58:33 UTC (rev 27313)
@@ -4061,7 +4061,7 @@
     our $foo            # lexically scoped alias to package variable
     has $foo            # object attribute
     state $foo          # persistent lexical (cloned with closures)
-    constant $foo       # lexically scoped compile-time constant
+    constant $foo       # "our" scoped compile-time constant
 
 Variable declarators such as C<my> now take a I<signature> as their
 argument.  (The syntax of function signatures is described more fully in S06.)

Modified: docs/Perl6/Spec/S12-objects.pod
===================================================================
--- docs/Perl6/Spec/S12-objects.pod	2009-06-29 23:44:51 UTC (rev 27312)
+++ docs/Perl6/Spec/S12-objects.pod	2009-06-30 01:58:33 UTC (rev 27313)
@@ -12,8 +12,8 @@
 
     Created: 27 Oct 2004
 
-    Last Modified: 10 Jun 2009
-    Version: 85
+    Last Modified: 29 Jun 2009
+    Version: 86
 
 =head1 Overview
 
@@ -965,14 +965,26 @@
 of the arguments match up with the declared types of the parameters of
 each candidate.  The best candidate is called, unless there's a tie,
 in which case the tied candidates are redispatched using any additional
-tiebreaker long names (see below).
+tiebreaker strategies (see below).  For the purpose of this nominal typing,
+no constrained type is considered to be a type name; instead the constrained type
+is unwound into its base type plus constraint.  Only the base type upon
+which the constrained type is based is considered for the nominal type
+match (along with the fact that it is constrained).  That is, if you have a parameter:
 
-If a tie still results, only candidates marked with the C<default> trait are
-considered, and the best matching default routine is used.  If there
-are no default routines, or if the available defaults are also tied,
-a final tie-breaking proto sub is called, if there is one (see above).
-Otherwise the dispatch fails.
+    subset Odd of Int where { $_ % 2 }
+    multi foo (Odd $i) {...}
 
+it is treated as if you'd instead said:
+
+    multi foo (Int $i where { $_ % 2 }) {...}
+
+Any constrained type is considered to have a base type that is "epsilon" narrower than
+the corresponding unconstrained type.  The compile-time topological sort
+takes into account the presence of at least one constraint, but nothing about the
+number or nature of any additional constraints.  If we think of Int' as
+any constrained version of Int, then Int' is always tighter nominally than Int.
+(Int' is a meta-notation, not Perl 6 syntax.)
+
 The order in which candidates are considered is defined by a
 topological sort based on the "type narrowness" of each candidate's
 long name, where that in turn depends on the narrowness of each
@@ -980,12 +992,56 @@
 Parameters whose types are not comparable are also considered tied.
 A candidate is considered narrower than another candidate if at least
 one of its parameters is narrower and all the rest of its parameters
-are either narrower or tied.  This defines the partial ordering of
-all the candidates.  If the topological sort detects a circularity in
-the partial ordering, all candidates in the circle are considered tied.
-A warning will be issued at C<CHECK> time if this is detected and there is
-no default candidate to fall back to.
+are either narrower or tied.  Also, if the signature has any additional
+required parameters not participating in the long name, the signature
+as a whole is considered epsilon tighter than any signature without
+extra parameters.  In essence, the remaining arguments are added to
+the longname as if the user had declared a capture parameter to bind
+the rest of the arguments, and that capture parameter has a constraint
+that it must bind successfully to the additional required parameters.
+All such signatures within a given rank are considered equivalent,
+and subject to tiebreaker A below.
 
+This defines the partial ordering of all the candidates.  If the
+topological sort detects a circularity in the partial ordering,
+all candidates in the circle are considered tied.  A warning will be
+issued at C<CHECK> time if this is detected and there is no suitable
+tiebreaker that could break the tie.
+
+There are three tiebreaking modes, in increasing order of desperation:
+
+    A) run-time constraint processing
+    B) use of a candidate marked with "is default"
+    C) use of a candidate marked as "proto"
+
+In the absence of any constraints, ties in the nominal typing
+immediately failover to tiebreaker B or C; if not resolved by B or C,
+they warn at compile time about an ambiguous dispatch.
+
+If there are any tied candidates with constraints, it follows from our
+definitions above that all of them are considered to be constrained.
+In the presence of longname parameters with constraints, or the
+implied constraint of extra required arguments, tiebreaker A is
+applied.  Candidates which are tied nominally but have constraints
+are considered to be a completely different situation, insofar as it
+is assumed the user knows exactly why each candidate has the extra
+constraints it has.  Thus, constrained signatures are considered to
+be much more like a switch defined by the user.  So for tiebreaker
+A the candidates are simply called in the order they were declared,
+and the first one that successfully binds (and completes without
+calling nextsame or nextwith) is considered the winner, and all the
+other tied candidates are ignored.  If all the constrained
+candidates fail, we throw out the rank of constrained variants and
+proceed to the next tighter rank, which may consist of the
+unconstrained variants without extra arguments.
+
+For ranks that are not decided by constraint (tiebreaker A),
+tiebreaker B is used: only candidates marked with the C<default>
+trait are considered, and the best matching default routine is used.
+If there are no default routines, or if the available defaults are
+also tied, tiebreaker C is used: a final tie-breaking proto sub is
+called, if there is one (see above).  Otherwise the dispatch fails.
+
 Ordinarily all the parameters of a multi sub are considered for dispatch.
 Here's a declaration for an integer range operator with two parameters
 in its long name:
@@ -1005,6 +1061,44 @@
 Note that a call to the routine must still be compatible with
 subsequent arguments.
 
+Note that the C<$by> is not a required parameter, so doesn't impose
+the kind of constraint that allows tiebreaker A.  If the default
+were omitted, it would be a required parameter, and subject to tiebreaker A.
+Likewise an ordinary named parameter does not participate as a tiebreaker,
+but you can mark named parameters as required to effectively make
+a switch based on named binding:
+
+    multi foo (Int $a;; :$x!) {...}     # constrained
+    multi foo (Int $a;; :$y!) {...}     # constrained
+    multi foo (Int $a;; :$z!) {...}     # constrained
+
+    multi foo (Int $a;; *%_) {...}      # unconstrained
+
+The first three are dispatched under tiebreaker A as a constrained
+rank.  If none of them can match, the final one is dispatched as
+an unconstrained rank, since C<*%_> is not considered a required
+parameter.
+
+Likewise, constrained types sort before unconstrained:
+
+    multi bar (Even $a) {...}   # constrained
+    multi bar (Odd $a) {...}    # constrained
+
+    multi bar (Int $a) {...}    # unconstrained
+
+And values used as subset types also sort first, and are dispatched
+on a first-to-match basis:
+
+    multi baz (0) {...}         # constrained
+    multi baz (1) {...}         # constrained
+
+    multi baz (Int $x) {...}    # unconstrained
+
+If some of the constrained candidates come by import from other modules,
+they are all considered to be declared at the point of of importation
+for purposes of tiebreaking; subsequent tiebreaking is provided by
+the original order in the used module.
+
 [Conjecture: However, a given multi may advertise multiple long names,
 some of which are shorter than the complete long name.  This is done
 by putting a semicolon after each advertised long name (replacing

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic