Author: larry Date: Sat Mar 10 16:02:36 2007 New Revision: 14329 Modified: doc/trunk/design/syn/S06.pod
Log: Whack in rethink of caller/context Modified: doc/trunk/design/syn/S06.pod ============================================================================== --- doc/trunk/design/syn/S06.pod (original) +++ doc/trunk/design/syn/S06.pod Sat Mar 10 16:02:36 2007 @@ -13,9 +13,9 @@ Maintainer: Larry Wall <[EMAIL PROTECTED]> Date: 21 Mar 2003 - Last Modified: 8 Mar 2007 + Last Modified: 10 Mar 2007 Number: 6 - Version: 74 + Version: 75 This document summarizes Apocalypse 6, which covers subroutines and the @@ -1678,24 +1678,65 @@ C<Capture> object is generated, not when it is later bound (which could happen more than once). -=head2 The C<caller> function +=head2 The C<context> and C<caller> functions -The C<caller> function returns an object that describes a particular -"higher" dynamic scope, from which the current scope was called. +The C<context> function returns an object that describes a particular +dynamic scope, either the current dynamic scope or some outer dynamic +scope from which the current scope was called. The current context +is numbered 0, and the immediate caller is numbered 1: - say "In ", caller.sub, - " called from ", caller.file, - " line ", caller.line; - -C<caller> may be given arguments telling it what kind of higher scope to -look for, and how many such scopes to skip over when looking: - - $caller = caller; # immediate caller - $caller = caller Method; # nearest caller that is method - $caller = caller Bare; # nearest caller that is bare block - $caller = caller Sub, :skip(2); # caller three levels up - $caller = caller Block where { .label eq 'Foo' }; - # caller whose label is 'Foo' + say " file ", context(1).file, + " line ", context(1).line; + +The C<caller> function is defined as + + &caller ::= &context.assuming(1); + +so the preceding example can also be written: + + say " file ", caller.file, + " line ", caller.line; + +or even + + say " file ", CALLER::<$?FILE>, + " line ", CALLER::<$?LINE>; + +The C<caller> function always returns the immediate caller's context, +but the more general C<context> function may be given arguments +telling it which higher scope to look for. The first argument is always +a count of how many contexts to skip: + + $ctx = context(0); # context(0), my own context + $ctx = context(1); # context(1), my caller's context + $ctx = context(2); # context(2), my caller's caller's context + $ctx = context($i); # $i'th caller's context + +The second argument is optional and is a matcher to apply against the +context object. + + $ctx = context(0, Method); # nearest context that is method + $ctx = context(1, Method); # 2nd nearest context that is method + $ctx = context(0, Block); # nearest context that is block + $ctx = context(2, Sub); # 3rd nearest sub context + $ctx = context(0, Block where { .label eq 'Foo' }); + # nearest context whose label is 'Foo' + +Note that this last potentially differs from the answer returned by + + Foo.context + +which returns the context of the innermost Foo block in the lexical scope +rather than the dynamic scope. + +The returned context object has the following methods: + + .want + .file + .line + .subname + +and basically anything else defined as C<$?NAME> there. (XXX cop out) =head2 The C<want> function