It is common in programming languages to use the idea of an expression, which might be
Infix just means that the function name appears among the arguments.
Prefix means that the function name appears first followed by its arguments.
Postfix means that arguments appear first and the function name last.
(f(a)+3)->b[c] = 2;
begin
a := if b < c then d else e;
a := begin f(b); g(c) end;
g(d);
2 + 3;
end
a,b = b,a
a,b,c = func(d,e,f)
a = b + c
d = c + e + b
a = b + c
d = a + e
if(x or y)
if(x and y)
if(p && p->value != something)
{
p = p->next;
}
jmp X => PC := X
branch X => PC := PC + X
call X => PUSH PC, PC := X
A Goto statement is pretty similar; name some line of code in some way, and then Goto that name.
Dijkstra and the Goto statement
How about "longjmp()"?
For an interesting discussion on Haskell's philosphy, see Error versus Exception
Structured exceptions are similar to multi-level returns and present similar implementation issues. (Try looking at the approachable (if dated) material here.)
if ((A>B) and (C>D) or (E != F) then
then-clause
else
else-clause
r1 := A
r2 := B
if r1 <= r2 goto L4
r1 := C
r2 := D
if r1 > r2 goto L1
L4:
r1:=E
r2:=F
if r1 == r2 goto L2
L1:
then-clause
goto L3
L2:
else-clause
L3:
case (X)
1: do_something();
200000: do_something_else();
20000000000: do_other_stuff();
endcase
for(INITIALIZATION;
BOOLEANEXPRESSION;
ITERATIONSTEP)
We can have other ideas, such as exception handling and concurrency, and even nondeterminancy (also, you might look at Non-deterministic parallelism considered useful.)
"Goto" is largely gone, and largely unlamented. However, in the end, what is actually running is built over actual "goto" (unlimited changes to the program counter.)