Author: lwall Date: 2009-12-03 20:00:40 +0100 (Thu, 03 Dec 2009) New Revision: 29250
Modified: docs/Perl6/Spec/S02-bits.pod docs/Perl6/Spec/S12-objects.pod docs/Perl6/Spec/S32-setting-library/Containers.pod Log: make pair values sequences both associative and positional revise enum mixins to distinguish attribute vs method mixin Modified: docs/Perl6/Spec/S02-bits.pod =================================================================== --- docs/Perl6/Spec/S02-bits.pod 2009-12-03 15:33:14 UTC (rev 29249) +++ docs/Perl6/Spec/S02-bits.pod 2009-12-03 19:00:40 UTC (rev 29250) @@ -13,8 +13,8 @@ Created: 10 Aug 2004 - Last Modified: 23 Nov 2009 - Version: 192 + Last Modified: 3 Dec 2009 + Version: 193 This document summarizes Apocalypse 2, which covers small-scale lexical items and typological issues. (These Synopses also contain @@ -1151,7 +1151,7 @@ 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 + PairValSeq Seq 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) @@ -1206,7 +1206,7 @@ Set Associative[Bool] Bag Associative[UInt] PairVal Associative - PairValSet Associative + PairValSeq Associative Postional Iterable Signature Parcel Positional Capture Positional Associative @@ -1227,7 +1227,7 @@ 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 - PairSet A Set of Pairs + PairSeq A Seq of Pairs Buf Perl buffer (a stringish array of memory locations) IO Perl filehandle Routine Base class for all wrappable executable objects @@ -1275,7 +1275,7 @@ 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<PairSet> are mutable in their +As with C<Hash> types, C<Pair> and C<PairSeq> 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 @@ -1288,8 +1288,9 @@ Hash Associative KeySet KeyHash[Bool] KeyBag KeyHash[UInt] + KeyHash Associative Pair Associative - PairSet Associative + PairSeq Associative Postional Iterable Buf Stringy IO Routine Callable Modified: docs/Perl6/Spec/S12-objects.pod =================================================================== --- docs/Perl6/Spec/S12-objects.pod 2009-12-03 15:33:14 UTC (rev 29249) +++ docs/Perl6/Spec/S12-objects.pod 2009-12-03 19:00:40 UTC (rev 29250) @@ -13,8 +13,8 @@ Created: 27 Oct 2004 - Last Modified: 28 Nov 2009 - Version: 93 + Last Modified: 3 Dec 2009 + Version: 94 =head1 Overview @@ -1713,7 +1713,7 @@ 3 ~~ Day # True, using Day as a subset of Int Day.mapping # hash of key/value pairs -The C<.mapping> method returns a C<PairValSet> that may be used like +The C<.mapping> method returns a C<PairValSeq> that may be used like a constant hash value: my enum CoinFace <Heads Tails>; @@ -1747,7 +1747,9 @@ %e<ook.> = 1; %e<ook?> = 2; -The enum installer inspects list values for pairs, where the value +The return value of an anonymous enum is a c<PairValSeq>. + +The enum composer inspects list values for pairs, where the value of the pair sets the next value explicitly. Non-pairs C<++> the previous value. (Str and buf types increment like Perl 5 strings.) Since the C<«...»> quoter automatically recognizes @@ -1782,7 +1784,7 @@ or the old one.) Any explicit sub or type definition hides all imported enum values of the same name but will produce a warning unless C<is redefined> is included. Note that true() is a built-in function -and requires an argument, while True is short for C<Bool::True> and +and requires an argument, while C<True> is short for C<Bool::True> and does not take an argument. Since non-native enum values know their enum type, they may be used to @@ -1801,16 +1803,31 @@ An enum type is not in itself a role type; however, the C<but> and C<does> operators know that when a user supplies an enum type, it implies the generation of an anonymous mixin role that creates an -attribute of the enum type along with an accessor. If we assume -there is a C<Has> role that creates an attribute, then +an appropriate accessor, read-write if an attribute is being created, and +read-only otherwise. It depends on whether you mix in the whole +or a specific enum value or the whole enum type: + $x = "Today" but Tue; # $x.Day is read-only + $x = "Today" but Day; # $x.Day is read-write + +Mixing in a specific enum object implies only the readonly accessor. + $x = "Today" but Tue; -really means something more like: +really means something like: - $x = "Today"; - $x does Has[Day, '$.Day', (:rw), { Tue }]; + $x = "Today".clone; + $x does anon role { method Day { Day::Tue } }; +The fully qualified form does the same thing, and is useful +in case of enum collision: + + $x = "Today" but Day::Tue; + +Note that the method name is still C<.Day>, however. If +you wish to mix in colliding method names, you'll have to +mixin your own anonymous role with different method names. + Since enum supplies the type name as a coercion, you can also say: @@ -1839,6 +1856,21 @@ all return false. +Mixing in the whole enum type produces a read-write attribute: + + $x = "Today" but Day; # read-write .Day + +really means something like: + + $x = "Today".clone; + $x does anon role { has Day $.Day is rw } + +Note that the attribute is not initialized. If that is desired +you can supply a C<WHENCE> closure: + + $x = "Today" but Day{ :Day(Tue) } + $x = "Today" but Day{ Tue } # conjecturally, for "simple" roles + To add traits to an enum declaration, place them after the declared name but before the list: @@ -1876,7 +1908,7 @@ $obj.Bool.Int != 0 Never compare a value to "C<true>", or even "C<True>". Just use it -in a boolean context. +in a boolean context. Well, almost never... If you wish to be explicit about a boolean context, use the high-level C<true> function or C<?> prefix operator, which are underlying based Modified: docs/Perl6/Spec/S32-setting-library/Containers.pod =================================================================== --- docs/Perl6/Spec/S32-setting-library/Containers.pod 2009-12-03 15:33:14 UTC (rev 29249) +++ docs/Perl6/Spec/S32-setting-library/Containers.pod 2009-12-03 19:00:40 UTC (rev 29250) @@ -19,8 +19,8 @@ Created: 19 Feb 2009 extracted from S29-functions.pod - Last Modified: 29 Sep 2009 - Version: 9 + Last Modified: 3 Dec 2009 + Version: 10 The document is a draft. @@ -810,19 +810,22 @@ =back -=head2 PairValSet +=head2 PairValSeq - class PairValSet does Associative {...} + class PairValSeq does Associative does Positional {...} -An immutable hash value, essentially. The keys may -not contain duplicates, while the values may. +An immutable hash value, viewable either as a (readonly) hash or +as a sequence of C<PairVal>s. The keys may not contain duplicates, +while the values may. -=head2 PairSet +=head2 PairSeq - class PairSet does Associative {...} + class PairSeq does Associative does Positional {...} -A hash value that is mutable only in values. The keys may -not contain duplicates, while the values may. +A hash value that is mutable only in values, differing from a normal +hash insofar as the key set is frozen. It may be accessed either as +a frozen hash or as a sequence of C<Pair>s. The keys may not contain +duplicates, while the values may. =head2 Set