4 ms·
> “I can use it safely” is not a good argument Rust could comparatively easily implement goto, and it’d be unconditionally safe (as regards memory safety). I’d
by chrismorgan 5y ago
> “I can use it safely” is not a good argument
Rust could comparatively easily implement goto, and it’d be unconditionally safe (as regards memory safety). I’d even honestly like it to, mostly just because it’s possible rather than because it’d be useful—most prominent goto patterns can be expressed better in other ways in Rust, e.g. RAII (destructors) instead of goto cleanup, and break/continue let you emulate any structured uses of goto. (I live in hope that https://github.com/rust-lang/rust/issues/48594 https://github.com/rust-lang/rust/issues/48594 will one day land, so you can use break to skip the remainder of a labelled block, no loop required.)
- afiori 5y agoI would also like continue to work that way, so that every (labelled) block can be freely looped and exited (with a value)
- chrismorgan 5y agoI don’t think I’d want continue to work on a block. Repeating the block seems different from leaving the block early (which can already be done with return or with panicking). I think it’s better to need to write it as a loop before you can continue.
- afiori 5y agoI completely agree, In rust looping has important semantics with regards to lifetimes and ownership so the continue part would be a bad idea. I think it would be cool in something like javascript (if blocks could return values...)
- jiggawatts 5y agoRead the articles I linked. This is essentially impossible, because Rust has gained features that C doesn't have by giving up goto. Adding goto back in would require those features to be removed, or to be watered down dramatically. You wouldn't be able to goto into or out of most (all?) blocks that would change ownership, for example.
- varajelle 5y agoWhy not? C++ still has goto despite also having RTTI. One just need to restrict a bit where we can jump.
- aix1 5y agoDo you mean RAII?
- ByteJockey 5y agoThat's not that much different than C. C's goto is already limited compared to the actual jump instruction because you can't cross function boundaries because of the restrictions C puts on you.
- chrismorgan 5y agoNo, not impossible at all; it will just reject any that would be memory-unsafe due to problems with borrow lengths, potentially undefined variables, and things like that. I never said you could goto absolutely anywhere; plenty of gotos are patently unsafe, and Rust would duly reject them. Rust currently checks borrows using control-flow graphs (though I believe the plan is for that to change, and the replacement might make life harder for implementing goto, I don’t know). Rust’s mid-level intermediate representation (MIR) actually has goto. In a control-flow graph, goto is just adding new edges, and it’s comparatively simple to make it work.