Author: lwall
Date: 2009-09-29 19:50:27 +0200 (Tue, 29 Sep 2009)
New Revision: 28502

Modified:
   docs/Perl6/Spec/S02-bits.pod
   docs/Perl6/Spec/S03-operators.pod
   docs/Perl6/Spec/S32-setting-library/Containers.pod
Log:
[S02,S03,S32]
add Stringy role
attempt to distinguish numeric objects from Numeric, Real, Integral, etc roles
split Pair into immutable PairVal and mutable Pair
split Mapping into immutable PairValSet and mutable PairSet
general typological housekeeping that will doubtless gobsmack the implementors


Modified: docs/Perl6/Spec/S02-bits.pod
===================================================================
--- docs/Perl6/Spec/S02-bits.pod        2009-09-29 17:43:15 UTC (rev 28501)
+++ docs/Perl6/Spec/S02-bits.pod        2009-09-29 17:50:27 UTC (rev 28502)
@@ -13,8 +13,8 @@
 
     Created: 10 Aug 2004
 
-    Last Modified: 20 Sep 2009
-    Version: 180
+    Last Modified: 29 Sep 2009
+    Version: 181
 
 This document summarizes Apocalypse 2, which covers small-scale
 lexical items and typological issues.  (These Synopses also contain
@@ -622,6 +622,23 @@
 
 =item *
 
+Perl supports generic types through what are called "roles"
+which represent capabilities or interfaces.  These roles
+are generally not used directly as object types.  For instance
+all the numeric types perform the C<Numeric> role, and all
+string types perform the C<Stringy> role, but there's no
+such thing as a "Numeric" object.  Common roles include:
+
+    Stringy
+    Numeric
+    Real
+    Integral
+    Callable
+    Positional
+    Associative
+
+=item *
+
 Perl 6 intrinsically supports big integers and rationals through its
 system of type declarations.  C<Int> automatically supports promotion
 to arbitrary precision, as well as holding C<Inf> and C<NaN> values.
@@ -641,6 +658,8 @@
 may also be explicitly cast to C<Num>.  (Also, if either side is
 C<Num> already, C<< infix:</> >> gives you a C<Num> instead of a C<Rat>.)
 
+C<Rat> and C<Num> both do the C<Real> role.
+
 Lower-case types like C<int> and C<num> imply the native
 machine representation for integers and floating-point numbers,
 respectively, and do not promote to arbitrary precision, though
@@ -971,8 +990,20 @@
     Failure     Failure (lazy exceptions, thrown if not handled properly)
 
 Whenever you declare any kind of type, class, module, or package, you're
-automatically declaring a undefined prototype value with the same name.
+automatically declaring a undefined prototype value with the same name, known
+as the I<type object>.  The name itself returns that type object:
 
+    Object      Perl 6 object (default block parameter type, either Any or 
junction)
+    Any         Perl 6 object (default routine parameter type, excludes 
junction)
+    Int         Any Int object
+    Widget      Any Widget object
+
+Type objects stringify to their name with empty parens concatenated.
+Note that type objects are not classes, but may be used to name
+classes:
+
+    Widget.new()        # create a new Widget
+
 Whenever a C<Failure> value is put into a typed container, it takes
 on the type specified by the container but continues to carry the
 C<Failure> role.  (The C<undef> function merely returns the most
@@ -1028,11 +1059,11 @@
 if and only if their types and contents are identical (that is, if
 C<$x.WHICH> eqv C<$y.WHICH>).
 
+    Str         Perl string (finite sequence of Unicode characters)
     Bit         Perl single bit (allows traits, aliasing, undef, etc.)
     Int         Perl integer (allows Inf/NaN, arbitrary precision, etc.)
-    Str         Perl string (finite sequence of Unicode characters)
-    Num         Perl number
-    Rat         Perl rational
+    Num         Perl number (approximate Real)
+    Rat         Perl rational (exact Real)
     Complex     Perl complex number
     Bool        Perl boolean
     Exception   Perl exception
@@ -1042,7 +1073,10 @@
     Range       A pair of Ordered endpoints
     Set         Unordered collection of values that allows no duplicates
     Bag         Unordered collection of values that allows duplicates
+    PairVal     An immutable Pair
+    PairValSet  Set of PairVals with no duplicate keys
     Signature   Function parameters (left-hand side of a binding)
+    Parcel      List of syntactic objects
     Capture     Function call arguments (right-hand side of a binding)
     Blob        An undifferentiated mass of bits
     Instant     A point on the continuous atomic timeline (TAI)
@@ -1073,6 +1107,33 @@
 a steady time base, such as POSIX systems, will simply have to make
 their best guess as to the correct atomic time.
 
+These types do (at least) the following roles:
+
+    Class       Roles
+    =====       =====
+    Str         Stringy
+    Bit         Numeric Boolean
+    Int         Numeric Integral
+    Num         Numeric Real
+    Rat         Numeric Real
+    Complex     Numeric
+    Bool        Boolean
+    Exception   Failure
+    Block       Callable
+    List        Iterable
+    Seq         Iterable
+    Range       Iterable
+    Set         Associative[Bool]
+    Bag         Associative[UInt]
+    PairVal     Associative
+    PairValSet  Associative
+    Signature   
+    Parcel      Positional
+    Capture     Positional Associative
+    Blob        
+    Instant     Real
+    Duration    Real
+
 =head2 Mutable types
 
 Objects with these types have distinct C<.WHICH> values that do not change
@@ -1082,11 +1143,10 @@
     Scalar      Perl scalar
     Array       Perl array
     Hash        Perl hash
-    KeyHash     Perl hash that autodeletes values matching default
     KeySet      KeyHash of Bool (does Set in list/array context)
     KeyBag      KeyHash of UInt (does Bag in list/array context)
     Pair        A single key-to-value association
-    Mapping     Set of Pairs with no duplicate keys
+    PairSet     A Set of Pairs
     Buf         Perl buffer (a stringish array of memory locations)
     IO          Perl filehandle
     Routine     Base class for all wrappable executable objects
@@ -1096,15 +1156,9 @@
     Macro       Perl compile-time subroutine
     Regex       Perl pattern
     Match       Perl match, usually produced by applying a pattern
-    Package     Perl 5 compatible namespace
-    Module      Perl 6 standard namespace
-    Class       Perl 6 standard class namespace
-    Role        Perl 6 standard generic interface/implementation
-    Grammar     Perl 6 pattern matching namespace
-    Any         Perl 6 object (default routine parameter type, excludes 
junction)
-    Object      Perl 6 object (default block parameter type, either Any or 
junction)
+    STASH       A symbol table hash (package, module, class, lexpad, etc)
 
-A C<KeyHash> differs from a normal C<Hash> in how it handles default
+The C<KeyHash> role differs from a normal C<Associative> hash in how it 
handles default
 values.  If the value of a C<KeyHash> element is set to the default
 value for the C<KeyHash>, the element is deleted.  If undeclared,
 the default default for a C<KeyHash> is 0 for numeric types, C<False>
@@ -1139,12 +1193,32 @@
 replicated the number of times specified by its corresponding value.
 (Use C<.kv> or C<.pairs> to suppress this behavior in list context.)
 
-As with C<Hash> types, C<Pair> and C<Mapping> are mutable in their
+As with C<Hash> types, C<Pair> and C<PairSet> are mutable in their
 values but not in their keys.  (A key can be a reference to a mutable
 object, but cannot change its C<.WHICH> identity.  In contrast,
 the value may be rebound to a different object, just as a hash
 element may.)
 
+The following roles are supported:
+
+    Scalar      
+    Array       Positional
+    Hash        Associative
+    KeySet      KeyHash[Bool]
+    KeyBag      KeyHash[UInt]
+    Pair        Associative
+    PairSet     Associative
+    Buf         Stringy
+    IO          
+    Routine     Callable
+    Sub         Callable
+    Method      Callable
+    Submethod   Callable
+    Macro       Callable
+    Regex       Callable
+    Match       Positional Associative
+    STASH       Associative
+
 =head2 Value types
 
 Explicit types are optional. Perl variables have two associated types:
@@ -1442,7 +1516,7 @@
 role implies the ability to support C<< postcircumfix:<[ ]> >>.
 
 Likewise, C<%x> may be bound to any object that does the C<Associative>
-role, such as C<Pair>, C<Mapping>, C<Set>, C<Bag>, C<KeyHash>, or
+role, such as C<Pair>, C<PairSet>, C<Set>, C<Bag>, C<KeyHash>, or
 C<Capture>.  The C<Associative> role implies the ability to support
 C<< postcircumfix:<{ }> >>.
 

Modified: docs/Perl6/Spec/S03-operators.pod
===================================================================
--- docs/Perl6/Spec/S03-operators.pod   2009-09-29 17:43:15 UTC (rev 28501)
+++ docs/Perl6/Spec/S03-operators.pod   2009-09-29 17:50:27 UTC (rev 28502)
@@ -14,8 +14,8 @@
 
     Created: 8 Mar 2004
 
-    Last Modified: 21 Sep 2009
-    Version: 173
+    Last Modified: 29 Sep 2009
+    Version: 174
 
 =head1 Overview
 
@@ -611,8 +611,8 @@
 
 Unlike in Perl 5, where C<+> is a no-op, this operator coerces to
 numeric context in Perl 6.  (It coerces only the value, not the
-original variable.)  For values that are not already considered
-numeric, the narrowest appropriate type of C<Int>, C<Num>, or
+original variable.)  For values that do not already do the
+C<Numeric> role, the narrowest appropriate type of C<Int>, C<Num>, or
 C<Complex> will be returned; however, string containing two integers
 separated by a C</> will be returned as a C<Rat>.  Exponential notation
 and radix notations are recognized.
@@ -631,8 +631,10 @@
 
     ~$x
 
-Coerces the value to a string.  (It only coerces the value, not the
-original variable.)
+Coerces the value to a string, if it does not already do the C<Stringy>
+role.  (It only coerces the value, not the original variable.)  As with
+numerics, it is guaranteed only to coerce to something C<Stringy>,
+not necessarily C<Str>.
 
 =item *
 
@@ -3247,8 +3249,8 @@
     Any       .<...>    hash value slice truth  ?all(X)  i.e. ?all(.<...>)
 
     Any       Bool      simple truth            X
-    Any       Num       numeric equality        +$_ == X
-    Any       Str       string equality         ~$_ eq X
+    Any       Numeric   numeric equality        +$_ == X
+    Any       Stringy   string equality         ~$_ eq X
 
     Hash      Pair      test hash mapping       $_{X.key} ~~ X.value
     Any       Pair      test object attribute   ?."{X.key}" === ?X.value (e.g. 
filetests)

Modified: docs/Perl6/Spec/S32-setting-library/Containers.pod
===================================================================
--- docs/Perl6/Spec/S32-setting-library/Containers.pod  2009-09-29 17:43:15 UTC 
(rev 28501)
+++ docs/Perl6/Spec/S32-setting-library/Containers.pod  2009-09-29 17:50:27 UTC 
(rev 28502)
@@ -19,8 +19,8 @@
 
     Created: 19 Feb 2009 extracted from S29-functions.pod
 
-    Last Modified: 12 May 2009
-    Version: 8
+    Last Modified: 29 Sep 2009
+    Version: 9
 
 The document is a draft.
 
@@ -719,7 +719,7 @@
 =head1 Classes
 
 This documents Buf, List, Seq, Range, Set, Bag, Junction, Array, Hash, 
KeyHash, KeySet,
-KeyBag, Pair, and Mapping.
+KeyBag, Pair, and PairSet.
 
 =head2 Seq
 
@@ -809,13 +809,20 @@
 
 =back
 
-=head2 Mapping
+=head2 PairValSet
 
-    class Mapping does Associative {...}
+    class PairValSet does Associative {...}
 
 An immutable hash value, essentially.  The keys may
 not contain duplicates, while the values may.
 
+=head2 PairSet
+
+    class PairSet does Associative {...}
+
+A hash value that is mutable only in values.  The keys may
+not contain duplicates, while the values may.
+
 =head2 Set
 
     class Set does Associative {...}
@@ -869,9 +876,9 @@
 
 =head2 KeyHash
 
-    class KeyHash does Associative {...}
+    role KeyHash[::T $t, $default = 0] does Associative {...}
 
-A KeyHash represents a mutable set of values, represented as the keys
+A C<KeyHash> represents a mutable set of values, represented as the keys
 of a C<Hash>.  When asked to behave as a list it ignores its values
 and returns only C<.keys>.  C<KeySet> and C<KeyBag> are derived from
 this type, but constrain their values to be C<Bool> and C<UInt>,

Reply via email to