I would say you don't need to put !
on every impure function. Community Clojure Style Guide recommends:
The names of functions/macros that are not safe in STM transactions should end with an exclamation mark.
So, basically, end with !
functions that change state for atoms, metadata, vars, transients, agents and io as well.
Thanks to @noisesmith for update.