Skip to content

Comment on A function decorator that rewrites the bytecode to enable goto in Pythonparent

Comments

Java actually has an elegant-for-Java feature that removes most credible uses of goto. You can label and break out of standalone code blocks. It makes error handling without exceptions no bad.

    label: {
        break label;
    }

And in most C-style languages that don’t have labelled blocks like this, you can use an infinite loop to achieve the same effect; for example, in Rust where labelled blocks aren’t yet stable:

  'label: loop {
      break 'label;
  }
And if you want to go one further on that, you can break with value because Rust is expression-oriented:
  fn main() {
      println!("Hello, {}!", 'label: loop {
          break 'label "world";
      });
  }

Swift also has (copied?) this...

https://docs.swift.org/swift-book/ReferenceManual/Statements...

(And I always forget about it)

You can have the same flow in python raising and catching an exception.

Doesn't Perl also have this? It would be a great feature in Python, although I wouldn't use it very often.

In Perl, any “bare block” is equivalent to a loop that only runs once. Useful in conjunction with redo too.

Oh my goodness! I'm using this right away (yesterday I was lamenting lack of goto for this exact use case.)

This is just Java, right? I don't think I've seen this in the C/C++ specs or compiler extensions.

Labeled break/continue are present in most languages that postdate Java. Go, JavaScript, Kotlin, Nim, Rust, Zig, for example, all have labeled break/continue as well. The only notable post-Java language I'm aware of that doesn't have it is C#. Languages that predate Java generally don't have such a feature--and this includes C/C++.

Well if you're using C, you could just use a proper goto.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.