Re: This Week on perl5-porters - (12-18 June 2006)

2006-06-23 Thread Sébastien Aperghis-Tramoni
Selon David Nicol <[EMAIL PROTECTED]>:

> On 6/22/06, David Landgren <[EMAIL PROTECTED]> wrote:
> > Could Perl get Reversible Debugging?
> > [...]
> >  We need a "come from" instruction
> >  http://xrl.us/nnuw
>
> I don't recall reading a demand for a "come from" instruction in that
> thread, but I had an idea last night that I was going to dismiss as trivial,
> until reading that assertion in the week in p5p summary.  It's a real
> simply come from instruction that forks at the labels instead of branching.
> Not suitable at all as a replacement for goto -- if you want to branch,
> use goto.  But may be useful for setting checkpoints/breakpoints with a
> minimum of surgical insult.
>
> [...]
>
> So.. shall I put this on CPAN?

OTOH, there's already Audrey Tang's Acme::ComeFrom
http://search.cpan.org/dist/Acme-ComeFrom/

--
Sébastien Aperghis-Tramoni

Close the world, txEn eht nepO.


Re: This Week on perl5-porters - (12-18 June 2006)

2006-06-22 Thread David Nicol

On 6/22/06, David Landgren <[EMAIL PROTECTED]> wrote:

Could Perl get Reversible Debugging?
[...]
 We need a "come from" instruction
 http://xrl.us/nnuw


I don't recall reading a demand for a "come from" instruction in that thread,
but I had an idea last night that I was going to dismiss as trivial,
until reading
that assertion in the week in p5p summary.  It's a real simply come from
instruction that forks at the labels instead of branching.  Not suitable at all
as a replacement for goto -- if you want to branch, use goto.  But may be
useful for setting checkpoints/breakpoints with a minimum of surgical insult.


package ComeFrom;
use Exporter;
@EXPORT_OK = qw/CFL ComeFromLabel CFlabel/, # all the same thing
  qw/ComeFrom CF/; # also all the same thing

our %SubsByLabel;

sub ComeFrom($\&){
   my ($label, $sub) = @_;
   push @{$SubsByLabel{$label}}, $sub;
};

sub ComeFromLabel($;){
   my $label = shift;
   foreach my $sub (@{$SubsByLabel{$label}}){
unless(fork()){ #fixme: check for -1; install sane
SIG_CHLD handler, etc
 goto &$sub; # keeping what's left of @_ after
shifting off the label
 exit; # we're not trying to make fork bombs here
}
   }
};

# establish more than one way to do it:
*CFL = *CFlabel = \&ComeFromLabel;
*CF = \&ComeFrom;

=head1 USAGE

Register subroutines with the ComeFrom system with the
ComeFrom::ComeFrom instruction
like so:

ComeFrom Jellybean => sub {
 print "At ",~~localtime(),
 "the bean count was ", CountBeans(),"\n"
};

Later this label can be jumped to -- this subroutine dispatched, or called, but
in its own process (that's the crucial difference between this mechanism and
a simple subroutine call -- subtle semantics) by inserting a 'JellyBean' CFlabel
into some code that may be affecting the bean count:

...
CFL 'Jellybean';
...

=head2 Differences Between ComeFromLabel and normal subroutine call

*  ComeFrom execution happens in own process

*  Multiple ComeFrom subroutines can be associated with a given label

* CFL markers can be trivially edited to #CFL no-ops after debugging

=head2 Why Bother?

This functionality is a trivial subroutine redispatcher. In the event
that it is easier
for you to write your own than install mine, please don't let me stop you.

=cut

__END__


So.. shall I put this on CPAN?

--
David L Nicol
"if life were like Opera, this would probably
have poison in it" -- Lyric Opera promotional
coffee cup sleeve from Latte Land