"Single Entry, Single Exit" foi escrito quando a maioria das programações era feita em linguagem assembly, FORTRAN ou COBOL. Ele tem sido amplamente mal interpretado, porque as linguagens modernas não suportam as práticas contra as quais Dijkstra estava advertindo.
"Single Entry" significa "não crie pontos de entrada alternativos para funções". Na linguagem de montagem, é claro, é possível inserir uma função em qualquer instrução. O FORTRAN suportou várias entradas para funções com a instrução ENTRY
:
SUBROUTINE S(X, Y)
R = SQRT(X*X + Y*Y)
C ALTERNATE ENTRY USED WHEN R IS ALREADY KNOWN
ENTRY S2(R)
...
RETURN
END
C USAGE
CALL S(3,4)
C ALTERNATE USAGE
CALL S2(5)
"Single Exit" significa que uma função só deve retornar para um local: a instrução imediatamente após a chamada. Não não significa que uma função só deve retornar de um lugar. Quando Programação Estruturada foi escrita, era prática comum para uma função indicar um erro retornando a um local alternativo. FORTRAN suportou isso via "retorno alternativo":
C SUBROUTINE WITH ALTERNATE RETURN. THE '*' IS A PLACE HOLDER FOR THE ERROR RETURN
SUBROUTINE QSOLVE(A, B, C, X1, X2, *)
DISCR = B*B - 4*A*C
C NO SOLUTIONS, RETURN TO ERROR HANDLING LOCATION
IF DISCR .LT. 0 RETURN 1
SD = SQRT(DISCR)
DENOM = 2*A
X1 = (-B + SD) / DENOM
X2 = (-B - SD) / DENOM
RETURN
END
C USE OF ALTERNATE RETURN
CALL QSOLVE(1, 0, 1, X1, X2, *99)
C SOLUTION FOUND
...
C QSOLVE RETURNS HERE IF NO SOLUTIONS
99 PRINT 'NO SOLUTIONS'
Ambas as técnicas eram altamente propensas a erros. O uso de entradas alternativas muitas vezes deixava alguma variável não inicializada. O uso de retornos alternativos teve todos os problemas de uma instrução GOTO, com a complicação adicional de que a condição da ramificação não era adjacente à ramificação, mas em algum lugar da sub-rotina.