Comment made by: stevenruppert
Looking back at this, the root cause of the problem is that the {pr} function, although it by default "print(link: s) in a way that objects can be read by the reader" (link: 0), doesn't always do so. Thus, the easiest "fix" is to change its docstring to warn that not all keywords can be read back.
The deeper problem is that symbol don't have a reader form that can represent all actually possible keywords (in this case, those with "@" in them). Restricting the actually-possible keywords to match the reader form, i.e. writing a strict "keyword" function actually seems like a worse solution overall to me. The better solution would be to somehow extend the keyword reader form to allow it to express all possible keywords, possibly ruby's :"keyword" syntax. Plus, that solution would avoid having to keep hypothetical strict keyword/symbol functions in sync with reader operation, and write test cases for that, and so on.
Thus, the resolution of this bug comes down to how far we're willing to go. Changing the docstring would be the easiest, but extending the keyword form would be the "best" resolution, IMO.
(link: 0): http://clojuredocs.org/clojure_core/clojure.core/pr