Ignoring atoms completely, here's an informal perspective on keywords:
I like to think of keywords conceptually like a string/symbol hybrid with special superpowers. Like symbols, they're restricted to certain characters (notably, no spaces allowed) and can be namespaced: :myproject.api/foo
. Like strings, they're really just a data primitive.
The main keyword superpower is that they can be called as functions to get values out of associative data structures like hash-maps: (:foo {:foo 42 "bar" 36})
=> 42
and sets: (:foo #{:foo :bar})
=> :foo
. You can't use strings or numbers as functions.
Here's a helpful StackOverflow answer about why keywords exist in Clojure: https://stackoverflow.com/a/11655615