in reply to Re^5: Continuations in Perl - Returning to an arbitrary level up the call stack
in thread Continuations in Perl - Returning to an arbitrary level up the call stack

I've checked the source. Such things cannot be implemented with goto. And setjmp()/longjmp() is best explanation found in pod.
Implementation done using eval EXPR (EXPR is a string) + goto RANDOM_label. Each time you call sub recursively - label is different!
  • Comment on Re^6: Continuations in Perl - Returning to an arbitrary level up the call stack

Replies are listed 'Best First'.
Re^7: Continuations in Perl - Returning to an arbitrary level up the call stack
by LanX (Saint) on May 19, 2013 at 00:04 UTC
      Already demonstrated:
      No, this example is not about recursion (although there is some).
      Nope! Jump-labels only change each time with_return constructs are called to avoid confusion if they are dynamically nested.
      That's what I told - they change each time you _call_ with_return, not each time you have with_return in code.

      Here is example. Try do same with "goto"

      use strict; use warnings; use Return::MultiLevel qw/with_return/; sub rec { my ($i, $return) = (@_, undef); $i++; print "i=$i\n"; if ($i == 3) { with_return { my $newreturn = shift; rec($i, $newreturn); }; } if ($i == 5) { $return->() if $return; } if ($i == 7) { return; } rec($i, $return); } rec(0); __END__ $ perl ml.pl i=1 i=2 i=3 i=4 i=5 i=4 i=5 i=6 i=7
        > Here is example.

        Well this is far beyond what the OP wanted!

        And your $return->() if $return clause makes it quite esoteric ...

        > Try do same with "goto"

        ... FWIW!

        use strict; use warnings; our $target=""; sub rec { my ($i) = @_; $i++; print "i=$i $target\n"; if ($i == 3) { target($i); } if ($i == 5) { goto $target if $target; } if ($i == 7) { return; } rec($i); } sub target { local $target="TARGET"; rec(shift); TARGET: } rec(0); __END__ i=1 i=2 i=3 i=4 TARGET i=5 TARGET i=4 i=5 i=6 i=7

        As I said it's only an abstraction of the goto mechanism!

        Good night! =)

        Cheers Rolf

        ( addicted to the Perl Programming Language)