Author: larry Date: Mon May 14 10:13:16 2007 New Revision: 14390 Modified: doc/trunk/design/syn/S02.pod doc/trunk/design/syn/S06.pod doc/trunk/design/syn/S12.pod
Log: coercion type renamed from "returns" to "as" to avoid confusion with "of" type. ambiguity in block-end parsing noted by rhr++ Modified: doc/trunk/design/syn/S02.pod ============================================================================== --- doc/trunk/design/syn/S02.pod (original) +++ doc/trunk/design/syn/S02.pod Mon May 14 10:13:16 2007 @@ -822,19 +822,19 @@ In either case this sets the C<of> property of the container to C<Dog>. -Subroutines have a variant of the C<of> property, C<returns>, that sets -the C<returns> property instead. The C<returns> property specifies a +Subroutines have a variant of the C<of> property, C<as>, that sets +the C<as> property instead. The C<as> property specifies a constraint (or perhaps coercion) to be enforced on the return value (either by explicit call to C<return> or by implicit fall-off-the-end return). This constraint, unlike the C<of> property, is not advertised as the type of the routine. You can think of it as the implicit type signature of the (possibly implicit) return statement. It's therefore available for -type inferencing within the routine but not outside it. If no inner type +type inferencing within the routine but not outside it. If no C<as> type is declared, it is assumed to be the same as the C<of> type, if declared. sub get_pet() of Animal {...} # of type, obviously our Animal sub get_pet() {...} # of type - sub get_pet() returns Animal {...} # inner type + sub get_pet() as Animal {...} # as type A value type on an array or hash specifies the type stored by each element: @@ -892,18 +892,19 @@ my Hash of Array of Recipe %book; # HoHoAoRecipe my %book of Hash of Array of Recipe; # same thing -The C<returns> form may be used in subroutines: +The C<as> form may be used in subroutines: - my sub get_book ($key) returns Hash of Array of Recipe {...} + my sub get_book ($key) as 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<< --> >> or prefix type +ignore a C<as> but pay attention to C<< --> >> or prefix type declarations, also known as the C<of> type. Only the inside of the -subroutine pays attention to C<returns>. +subroutine pays attention to C<as>, and essentially coerces the return +value to the indicated type, just as if you'd coerced each return expression. You may also specify the C<of> type as the C<of> trait: @@ -963,18 +964,18 @@ On a scoped subroutine, a return type can be specified before or after the name. We call all return types "return types", but distinguish -two kinds of return types, the C<inner> type and the C<of> type, +two kinds of return types, the C<as> type and the C<of> type, because the C<of> type is normally an "official" named type and -declares the official interface to the routine, while the C<inner> +declares the official interface to the routine, while the C<as> type is merely a constraint on what may be returned by the routine from the routine's point of view. - our sub lay returns Egg {...} # inner type + our sub lay as Egg {...} # as type our Egg sub lay {...} # of type our sub lay of Egg {...} # of type our sub lay (--> Egg) {...} # of type - my sub hat returns Rabbit {...} # inner type + my sub hat as Rabbit {...} # as type my Rabbit sub hat {...} # of type my sub hat of Rabbit {...} # of type my sub hat (--> Rabbit) {...} # of type @@ -983,14 +984,14 @@ namespace (module, class, grammar, or package), as if it's scoped with the C<our> scope modifier. Any return type must go after the name: - sub lay returns Egg {...} # inner type + sub lay as Egg {...} # as type sub lay of Egg {...} # of type sub lay (--> Egg) {...} # of type On an anonymous subroutine, any return type can only go after the C<sub> keyword: - $lay = sub returns Egg {...}; # inner type + $lay = sub as Egg {...}; # as type $lay = sub of Egg {...}; # of type $lay = sub (--> Egg) {...}; # of type @@ -1003,14 +1004,14 @@ without affecting the meaning. 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 signature. This doesn't mean exactly the same thing as C<as>. The C<of> type is the "official" return type, and may therefore be -used to do type inferencing outside the sub. The C<inner> type only +used to do type inferencing outside the sub. The C<as> type 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 we don't know anything about the return value, as if no return type had been declared. The prefix form specifies the C<of> type rather than -the C<inner> type, so the return type of +the C<as> type, so the return type of my Fish sub wanda ($x) { ... } @@ -1020,15 +1021,15 @@ I<not> as if you'd said - my sub wanda ($x) returns Fish { ... } + my sub wanda ($x) as Fish { ... } -It is possible for the C<of> type to disagree with the C<inner> type: +It is possible for the C<of> type to disagree with the C<as> type: - my Squid sub wanda ($x) returns Fish { ... } + my Squid sub wanda ($x) as Fish { ... } or equivalently, - my sub wanda ($x --> Squid) returns Fish { ... } + my sub wanda ($x --> Squid) as Fish { ... } This is not lying to yourself--it's lying to the world. Having a different inner type is useful if you wish to hold your routine to Modified: doc/trunk/design/syn/S06.pod ============================================================================== --- doc/trunk/design/syn/S06.pod (original) +++ doc/trunk/design/syn/S06.pod Mon May 14 10:13:16 2007 @@ -13,9 +13,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 21 Mar 2003 - Last Modified: 28 Mar 2007 + Last Modified: 14 May 2007 Number: 6 - Version: 82 + Version: 83 This document summarizes Apocalypse 6, which covers subroutines and the @@ -143,7 +143,7 @@ statement level control syntax. A bare block where a term is expected merely produces a C<Code> object. 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. +by a comma or comma surrogate (intervening C<\h*> or "unspace" is allowed). =head2 "Pointy blocks" Modified: doc/trunk/design/syn/S12.pod ============================================================================== --- doc/trunk/design/syn/S12.pod (original) +++ doc/trunk/design/syn/S12.pod Mon May 14 10:13:16 2007 @@ -1316,13 +1316,13 @@ } Other traits are applied with a single word, and we call one of those a -"trait verb". For instance, the "C<returns>" trait +"trait verb". For instance, the "C<as>" trait is defined something like this: - role returns { - has ReturnType $.returns; - multi sub trait_verb:returns($container; ReturnType $arg) { - $container does returns($arg); + role as { + has ReturnType $.as; + multi sub trait_verb:as($container; ReturnType $arg) { + $container does as($arg); } ... } @@ -1811,7 +1811,7 @@ name the name of the method signature the parameters of the method - returns the return type of the method + as the coercion type of the method multi whether duplicate names are allowed do the method body