Rich Morin writes:
> In any case, one way of doing something like this in Perl might
> be to have the ability to register exceptions for a range of
> quite ordinary behavior, such as entering or leaving a statement,
> setting or even accessing a variable, etc.

Or passing a variable to a function.  This is sort of a hot topic in my
brain right now.  It turns out that Junctions cover some of the same
ground as your hooks want to.

I definitely want such hooks.

You can do it easily at compile time with a grammar munge that munges no
grammar:

    grammar DebugPerl is Perl {
        rule statement {
            { Parrot::emit "enter_hook()" }
            <super>         # call Perl::statement
            { Parrot::emit "exit_hook()" }
        }
    }
    use grammar DebugPerl;

For certain values of enter_hook() and exit_hook().

But another thing that would be nice is to track a value to see where
it's being used/changed.  Better yet, to implement a module that makes
use of that tracking ability to do some magick.

Don't mind if I digress from your question a bit now.  For large values
of "a bit".

I've been thinking of an Operator type class that represents "something
to be done".  Operatable variables would get a hook called with the
operator as an argument instead of doing something.  Junctions are
pretty easy if you do that:

    multi sub OVERLOAD (Conjunction $j: Operator $o) {
        map { $o.($_) } $j.states;
    }
    multi sub OVERLOAD (Conjunction $j: Operator::Boolify $o) {
        for ($j.states) {
            $_ or return;
        }
        return 1;
    }

And it opens up a huge field of junction-like things that you can do,
never before possible.  It's like a super-powerful tie.  

The question is: how do you catch these naughty values in the act?  If
we marked variables that could hold them and were forced to explicitly
type any function that returned them, then it's easy to do with no speed
hit to the unaware.

But we might be able to do better than that (that is, very little speed
hit without syntactic markings).

Whenever a magick value is created, it marks a scope local flag
"NAUGHTYBUSINESS", which is checked before magick hooks.  If it's on,
then the sub can branch to a less efficient, more aware version of the
call and proceed from there.  But then you still have to check a flag
before your hooks, which puts a limit on how many hooks you can have.

Warning:  highly theoretical stuff follows:

A really nice thing to be able to do is to change the implementation of
a sub while it's running, and be able to come back in the middle of the
changed one.  It's also a very hard thing to do, and usually deemed
impossible.

But I've been thinking that it's not, in fact, impossible.  If the two
subs are the same semantically (that is, you're not coming back saying
that "no I didn't do that" when you already did), and you have details
of both implementations, then it would be possible to make a mapping
from the old implementation's lexical state to the new one's at some
point in the execution.   I'm not sure how restrictive the restrictions
would have to be, but I'm sure that it works for at least a few useful
cases.

Did that answer your question?  :-p

Luke

Reply via email to