NAME
Acme::ComeFrom - Parallel goto-in-reverse
SYNOPSIS
use Acme::ComeFrom;
sub func { print "@_" }; func("start\n");
print "won't happen\n";
comefrom &func; print "branch 1\n"; exit;
comefrom &func; print "branch 2\n";
label: print "won't happen either\n";
comefrom label; print "branch 2.1\n"; exit;
comefrom label; print "branch 2.2\n";
expr0: print "to be\n"; exit;
comefrom "expr".int(rand(2)); print "not to be\n";
DESCRIPTION
INTERCAL programmers have for a long time monopolized the enormously powerful construct COME FROM
, both as a flow-control replacement to goto
, and as a simple way to mark parallel execution branches in the multi-thread variant.
But now, with Acme::ComeFrom, we perl hackers could finally be on par with them in terms of wackiness, if not in obfuscation.
Just like goto
, comefrom
comes in three different flavors:
- comefrom LABEL
-
The
comefrom-LABEL
form finds the statement labeled with LABEL and jumps to thecomefrom
each time just before that statement's execution. Thecomefrom
may not be inside any construct that requires initialization, such as a subroutine or aforeach
loop, unless the targeting LABEL is also in the same construct. - comefrom EXPR
-
The
comefrom-EXPR
form expects a label name, whose scope will be resolved dynamically. This allows for computedcomefrom
s by checking theEXPR
before every labels (a.k.a. watchpoints), so you could write ($i evaluates in the LABEL's scope):comefrom ("FOO", "BAR", "GLARCH")[$i];
Please note that the value of EXPR is frozen at the first time it is checked. This behaviour might change in the future.
- comefrom &NAME
-
The
comefrom-&NAME
form is quite different from the other forms ofcomefrom
. In fact, it isn't a comefrom in the normal sense at all, and doesn't have the stigma associated with othercomefrom
s. Instead, it installs a post-processing handler for the subroutine, so a jump is made just after the subroutine's execution.
If two or more comefrom
were applied to the same LABEL, EXPR or NAME, they will be executed simultaneously via fork()
. The forking are ordered by the occurrance of comefrom
s, with the parent process receiving the last one.
BUGS
To numerous to be counted; this is only a prototype version.
ACKNOWLEDGEMENTS
To the INTERCAL language, for its endless inspiration.
As its manual states: "The earliest known description of the COME FROM statement in the computing literature is in [R. L. Clark, "A linguistic contribution to GOTO-less programming," Commun. ACM 27 (1984), pp. 349-350], part of the famous April Fools issue of CACM. The subsequent rush by language designers to include the statement in their languages was underwhelming, one might even say nonexistent. It was therefore decided that COME FROM would be an appropriate addition to C-INTERCAL."
To Maestro Damian Conway, the source of all magic bits in Hook::LexWrap and Filter::Simple, on which this module is based.
To Ton Hospel, for his tolerance on my semantic hackeries, and suggesting the correct behaviour of comefrom-LABEL
and comefrom-EXPR
.
AUTHORS
Autrijus Tang <autrijus@autrijus.org>
COPYRIGHT
Copyright 2001 by Autrijus Tang <autrijus@autrijus.org>.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.