in reply to Re^11: 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

> This is getting more and more abstract and convoluted! Dynamic jump-levels? Come on...

I'm bored ... voila!

use strict; use warnings; our $restore; sub rec { my ($i) = @_; $i++; print ">> i=$i\n"; if ($i <= 9) { target($i); } goto TARGET if $i > $restore; print "<< i=$i\n"; } sub target{ rec(shift); TARGET: } #--- Tests for $restore (6,3){ print "\n\n","-"x5," Restore at $restore\n"; rec(0); } __END__ ----- Restore at 6 >> i=1 >> i=2 >> i=3 >> i=4 >> i=5 >> i=6 >> i=7 >> i=8 >> i=9 >> i=10 << i=6 << i=5 << i=4 << i=3 << i=2 << i=1 ----- Restore at 3 >> i=1 >> i=2 >> i=3 >> i=4 >> i=5 >> i=6 >> i=7 >> i=8 >> i=9 >> i=10 << i=3 << i=2 << i=1

Again less and clearer code, and w/o generating dynamic labels with eval!

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^13: Continuations in Perl - Returning to an arbitrary level up the call stack
by vsespb (Chaplain) on May 20, 2013 at 09:03 UTC

    And this is cheat again. 'goto' executed 4 times in 1st test, and 7 times in last test. You can achieve same if replace 'goto' with return, there won't be 'goto' in this code at all then (i.e. you rewrited this one particular case with plain recursion, without jumping frames)

    And by the way, just in case if you pretend that it's always best to work that way, here is your posting where you explain to another monk, that it's not http://www.perlmonks.org/?node_id=1034169

    For instance, when designing a recursion to search a graph it's sometimes desirable to stop immediately after the goal is reached.
    Also, this your cite explains everything
    goto always jumps to the last TARGET -label in the call-stack and
    So,

    1 LABEL in source code can "remember" 1 stackframe.

    and

    1 with_return statement in source code can "remember" N stackframes.

      > You can achieve same if replace goto with return

      I know, but you designed this strange example.

      > And by the way, just in case if you pretend that it's always best to work that way,

      The point is about ease of design not speed.

      But being obliged to call a routine which does evals for each single recursion level can hardly be faster then jumping back level by level.

      with_return is neither easier to code nor faster.

      > > For instance, when designing a recursion to search a graph it's sometimes desirable to stop immediately after the goal is reached.

      Indeed I gave a real world example of searching a labyrinth.

      You gave us strange code without motivation!

      For me, the point about "multi returns" is to be able to use a simple algorithm that searches a complete graph, which can be easily changed with a minimum of code to have a fast exit.

      Thats what goto does w/o overhead of a strange module.

      edit

      > And this is cheat again.

      I used plain perl to solve tasks you "designed", producing the same output faster and with less code.

      Who's cheating?

      Cheers Rolf

      ( addicted to the Perl Programming Language)

        derby thinks this conversations needs to erase the call stack back to the OP

        -derby