5 ms·
Goto? Dangerous? Proven to be? The time has shown that anti goto cult was huge overreaction that gained size due to decades long brain washing by academics o
by hardware2win 3y ago
Goto?
Dangerous?
Proven to be?
The time has shown that anti goto cult was huge overreaction that gained size due to decades long brain washing by academics on inexperienced programming practicioners (students)
Goto in newer languages is not bad and exceptions which arent as criticized are way more powerful in goto-like sense
Original gotos from that infamous paper were more powerful
- _a_a_a_ 3y ago> Goto in newer languages is not bad can you clarify that please. > and exceptions which arent as criticized are way more powerful in goto-like sense They are less general therefore less powerful, and by that, less capable of being abused.
- hardware2win 3y agoGoto in e.g c# doesnt allow you to jump wherever you want Youre limited by scope, and since we do not write imperative code nowadays everywhere then it is enough to make significant difference
- _a_a_a_ 3y agoNeither did goto in Pascal. Exceptions are further constrained. You can't do 10: goto 10 With exceptions. > since we do not write imperative code nowadays Who's 'we'? I certainly do when appropriate.
- kazinator 3y agoIn fact you can. In Common Lisp, (go ...) is a dynamic control transfer that performs unwinding and can jump out of a lambda. This is similar to what blub languages call exception handling. (tagbody 10 (format t "label 10~%") (unwind-protect (funcall (lambda () (go 10))) (format t "unwinding!~%"))) Output: label 10 unwinding! label 10 unwinding! ... How it works is that (go 10) identifies the surrounding tagbody as an exit point for the exception-like dynamic control transfer. That (go 10) is occurring in a sub-form of tagbody. That entire sub-form is abandoned, with unwinding, and then tagbody catches that control transfer, like an exception handler. tagbody then switches control to the desired label. Effectively, the exception-like control transfer is accompanied by a piece of datum: the label. tagbody requires lexical visiblity between the go and tagbody; though the label bindings and the control transfer are dynamic, they have to be physically enclosed. That allows compilers to optimize tagbody more. A Common lisp compiler doesn't have to suspect that function (foo) can branch to the label bar in (tagbody (foo) bar) and can conclude that the label is unused, and the tagbody can be entirely optimized away. However, cross-function go does work, as the lambda shows in my example.
- _a_a_a_ 3y agois this something to do with call/cc? (which I never understood)