Before using the word "pure" it should be mandatory to define the sense in which you are using it. There are at least two senses, and people talk at cross purposes and get awfully antagonistic.
Sense (1): The return value of f can only depend on x, and not y (or anything else)
x = ...
y = ...
ret = f x
Sense (2): A program written in the language can't interact with the outside world.
You don't consider Haskell to be pure? A big win of using monads for side effects was to keep purity right?