Hey all.  This is going to seem like a kind of wierd suggestion (it isn't
yet fleshed out enough to call a proposal), but...

First, let's define a context as everything needed to goto a point.  Thus,
it's a mixture of a pointer into the instruction stream (internals people,
please forgive me for abusing your vocabulary) and a variable stash.  It's
also needed to: call a closure, return into a started coroutine, go up and
down the call-stack when debuging, introspect, local()ize variables, and
probably a bunch of other things.

So, how should perl code be able to get to them?
1) A function that returns the current context.
    $current_context = context();
2) A function that returns the context for a closure.
    $closures_context = context(\&closure);
3) A function that returns the stack of currently executing contexts.
    @current_stack = context();
(Note: I think that the current context should be first on the list, then
the caller thereof, unto the nth degree.)

[Note that context() has a superset of the capibilities of caller().  I
don't take this to be reason to remove caller().]

Now, what can a context object do?
1) Execute arbitrary code from within that context: $context->eval(STRING),
or $context->eval(CODEREF).
2) Find the value of a variable as seen from within that context...
$$context->{scalar}/@$context->{array}?  I'm not certian of the synthax on
this one.  Note that it's equivlent to $context->eval("$scalar").
3) Goto the context: $context->goto;
4) Change the value of a variable as seen from within that context...
$context->$scalar = 42?  That synthax isn't meaningful in existing perl, but
feels natural...  Note that this synthax should be the lvalue equiv of 2.
5) [Returning to a started coroutine is gotoing into it]
6) Everything that caller() can do -- give the package, filename,
linenumber, type, label.

Here, type and label aren't quite what eval gives...
type is one of require, plain (for plain { } blocks), do, eval, try, sort,
etc, etc (basicly, every op that takes a BLOCK), and label is the label of
the loop, or name of the sub (if non-anonymous).

What do you guys think?

    -=- James Mastros

Reply via email to