in reply to Re^10: 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 hacking for 30 years now and never needed this! :)

In this concrete case I would only call target() if a recursion level is really expected to be a jump target, that are 6 and 3 in your examples.

(If not possible in advance I would just step back single levels (return or goto) till I reach the desired one, Something like eval "LABEL:" would be my very last resort)

And even multiple calls to target are no problem, cause the goto always jumps to the last TARGET -label in the call-stack and local $target cares about restoring previous levels. This works w/o any string- eval.

I would never use with_return in the way you are showing, because

  1. it's not obvious what it does, I can name the target() function in a expressive way

  2. it has plenty of overhead, many of my recursions are long-running branch-and-bound searches which need to be optimized.

  3. the need to explicitly pass the return-sub along is IMHO very annoying

> Your code is a bit cheat - you implemented another subroutine, just to remember point in the stack.

Nope, it's like in the original code I gave. And as I said Return::MultiLevel just uses the same technique under the hood.

Anyway let's stop it here please! =)

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^12: Continuations in Perl - Returning to an arbitrary level up the call stack
by LanX (Saint) on May 20, 2013 at 02:16 UTC
    > 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)

      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)

Re^12: Continuations in Perl - Returning to an arbitrary level up the call stack
by vsespb (Chaplain) on May 19, 2013 at 13:05 UTC
    Anyway let's stop it here please! =)
    Ok, but just to summarize this subthread:
    Return::MultiLevel functionality cannot be re-invented with goto, and all your listed arguments against this are not valid, emotional, or not directly related to the case =)
      > Return::MultiLevel functionality cannot be re-invented with goto,

      Which is still nonsense since the module is based on goto LABEL.

      > and all your listed arguments against this are not valid, emotional, or not directly related to the case =)

      Well this attitude pretty much summarizes the impression I already got from you ...

      Please, go on down-voting me!

      Cheers Rolf

      ( addicted to the Perl Programming Language)