Author: lwall
Date: 2010-06-19 04:24:36 +0200 (Sat, 19 Jun 2010)
New Revision: 31372
Modified:
docs/Perl6/Spec/S06-routines.pod
Log:
[S06] spec processing of rw vs de-containerized return values
Modified: docs/Perl6/Spec/S06-routines.pod
===================================================================
--- docs/Perl6/Spec/S06-routines.pod 2010-06-19 00:01:35 UTC (rev 31371)
+++ docs/Perl6/Spec/S06-routines.pod 2010-06-19 02:24:36 UTC (rev 31372)
@@ -16,8 +16,8 @@
Created: 21 Mar 2003
- Last Modified: 21 May 2010
- Version: 134
+ Last Modified: 18 Jun 2010
+ Version: 135
This document summarizes Apocalypse 6, which covers subroutines and the
new type system.
@@ -2212,6 +2212,31 @@
=head1 Advanced subroutine features
+=head2 Processing of returned values
+
+It is a general policy that lvalues should only be returned up the dynamic
+call stack if specifically requested. Therefore, by default the returned
+arguments are processed to enforce this, both for the implicit return from
+the last statement of any block, as well as the explicit return done by
+operators such as:
+
+ return
+ leave
+ take
+
+Specifically, this processing involves examining the returned parcel's
+arguments and dereferencing any container that could be used as an lvalue,
+replacing it with the container's value.
+
+To override this processing for a routine, it must be declared C<rw>, or
+the form C<return-rw> must be used.
+
+To override for a C<gather>, use C<gather-rw> instead, or C<take-rw> on the
+individual take.
+
+Since blocks don't generally have traits, you must use C<leave-rw> to pass
+an lvalue out of a block.
+
=head2 The C<return> function
The C<return> function notionally throws a control exception that is