Я просто хочу сказать, что если речь заходит о побочных эффектах, то есть два варианта:
1. Их нет (функцианальщина)
2. Их есть (императивщина)

Причем, во втором случае функции вообще исчезают в их изначальном смысле. А есть только процедура, которая кладет что-то в AX (и т.д.)

Ну, то бишь:

PROCEDURE foo(VAR A: INTEGER);
BEGIN
A := A * 2;
END;

эквивалентно

PROCEDURE foo(A): INTEGER;
BEGIN
RETURN A * 2;
END;

Не знаю короче как еще выразиться. В общем, в императивном языке требовать от функций чистоты большого смысла не имеет. Это дело вкуса.