When use exclamation (!) mark in names of functions?
Naming is a hard thing. What
! really mean in functions names? When to use it?
On site clojure-style-guide we can read:
The names of functions / macros that are not safe in STM transactions should end with an exclamation mark (e.g. reset!).
But what does it really mean? Anything what has a non-idempotent side effect.
Idempotent operation is the one that has no additional effect if it is called more than once with the same input parameters.
Make it simple:
Why do we need that? Functions in STM transactions can be run many times, because of some conflicts. So using function
create-user! you will add the same user many times, but function
create-user-only-if-not-exist will add him only once, even if it will be run many times.
(create-user! ...) has additional effects if you run it more than once with the same input. For example send e-mail each time or create +1 user.
(create-user ...) wouldn’t have additional effects even if you run this many times with the same input.