Author: lwall
Date: 2010-02-25 01:36:07 +0100 (Thu, 25 Feb 2010)
New Revision: 29830

[S12] note how lastcall allows nextsame control of nested dispatchers

Modified: docs/Perl6/Spec/S12-objects.pod
--- docs/Perl6/Spec/S12-objects.pod     2010-02-24 20:22:53 UTC (rev 29829)
+++ docs/Perl6/Spec/S12-objects.pod     2010-02-25 00:36:07 UTC (rev 29830)
@@ -13,8 +13,8 @@
     Created: 27 Oct 2004
-    Last Modified: 23 Jan 2010
-    Version: 97
+    Last Modified: 24 Jan 2010
+    Version: 98
 =head1 Overview
@@ -891,8 +891,30 @@
 For the multiple call variants, C<lastcall> will cause the dispatcher
 to throw away the rest of the candidate list, and the subsequent
 return from the current method will produce the final C<Capture>
-in the returned list.
+in the returned list.  (If you were already on the last call of the
+candidate list, it is a no-op, it does not proceed on towards any
+outer dispatcher's candidate list until you have returned from the
+last call to the current list.)
+Since it's possible to be dispatching within more than one candidate
+list at a time, these control flow calls are defined to apply only to
+the dynamically innermost dispatcher.  If, for instance, you have a
+single dispatch that then calls into a multiple dispatch on the multi
+methods within a class, C<nextsame> would go to the next best multi
+method within the class, not the next method candidate in the original
+single dispatch.  This is not a bad limitation, since dispatch loops
+are dynamically scoped; to get to the outermost lists you can "pop"
+unwanted candidate lists using C<lastcall>:
+    lastcall; nextsame;  # call next in grandparent dispatcher loop
+[Conjecture: if necessary, C<lastcall> could have an argument
+or invocant to specify which kind of a dispatch loop we think
+we're throwing away, in case we're not sure about our context.
+This confusion could arise since we use C<nextsame> semantics at
+least three different ways: single dispatch, multiple dispatch,
+and routine wrapper dispatch.]
 =head1 Parallel dispatch
 Any of the method call forms may be turned into a hyperoperator by

Reply via email to