Author: lwall
Date: 2009-09-21 03:28:27 +0200 (Mon, 21 Sep 2009)
New Revision: 28334
Modified:
docs/Perl6/Spec/S02-bits.pod
Log:
[S02] clarification of run-time-ish nature of (* * *) requested by JimmyZ++
Modified: docs/Perl6/Spec/S02-bits.pod
===================================================================
--- docs/Perl6/Spec/S02-bits.pod 2009-09-21 00:10:30 UTC (rev 28333)
+++ docs/Perl6/Spec/S02-bits.pod 2009-09-21 01:28:27 UTC (rev 28334)
@@ -13,8 +13,8 @@
Created: 10 Aug 2004
- Last Modified: 5 Sep 2009
- Version: 179
+ Last Modified: 20 Sep 2009
+ Version: 180
This document summarizes Apocalypse 2, which covers small-scale
lexical items and typological issues. (These Synopses also contain
@@ -832,17 +832,39 @@
{ $_ - 1 }
-Likewise, the single dispatcher recognizes C<*.meth> and returns C<{ $_.meth
}>,
-so it can be used where patterns are expected:
+This closure is officially returned at run time, so it is I<not>
+subject to the rule that bare closures execute immediately when used as
+a statement. However, in most cases the result of a multiple dispatch
+can be determined at compile time, so the compiler is expected to
+optimize away the run-time call. Hence, despite the fact that the
+inside of parentheses is considered a statement, if you say
+ (* + 7)(3) # 10
+
+the generated C< { $_ + 7 } > closure is returned uncalled
+by those parentheses and then invoked by the C<.(3)> postfix. In
+contrast,
+
+ ( { $_ + 7 } )(3)
+
+evaluates the bare block immediately with whatever C<$_> is already in
+scope, and then fails because a number doesn't know how to respond
+to the C<.(3)> invocation.
+
+Likewise, the single dispatcher offically recognizes C<*.meth> at run time
+and returns C<{ $_.meth }>, so it can be used where patterns are expected:
+
@primes = grep *.prime, 2..*;
+This also should be optimized to a closure by the compiler. Basically,
+dispatches to C<Whatever> are assumed to be subject to constant folding.
+
If multiple C<*> appear as terms within a single expression, the resulting
-closure binds them all to the same argument, so C<* * *> translates to
+closure binds them all to the same argument, so C<* * *> returns the closure
C<{ $_ * $_ }>.
-These closures are of type C<WhateverCode>, not C<Whatever>, so that
constructs can distinguish
-via multiple dispatch:
+These returned closures are of type C<WhateverCode>, not C<Whatever>,
+so that constructs can distinguish via multiple dispatch:
1,2,3 ... *
1,2,3 ... *+1
@@ -863,6 +885,9 @@
The C<...> operator is instead dispatching bare C<*> to a routine that
does dwimmery, and in this case decides to supply a function { * + 1 }.
+There is no requirement that an operator return a closure when C<Whatever>
+is used as an argument; that's just the I<typical> behavior for functions
+that have no intrinsic "globbish" meaning for C<*>.
The final element of an array is subscripted as C<@a[*-1]>,
which means that when the subscripting operation discovers a C<WhateverCode>