Clojure as of 2015 and earlier allows the creation of symbols and keywords that can be printed, but not read back in. For example:
user=> (-> "a@b" keyword pr-str)
user=> (-> "a@b" keyword pr-str read-string)
Only a few characters are officially documented as being supported in symbols and keywords at http://clojure.org/reader, as of Jun 1 2015
* + ! - _ ? allowed
non repeating : in the middle allowed
. or : at beginning or end reserved for Clojure only
/ by itself names division function
However, Clojure 1.6.0 itself uses characters that are not on the list of supported characters, e.g. in symbols such as inc' <= >=
First, document a larger set of characters as officially supported in symbols and keywords, so that Clojure itself is limited by its own documented restrictions. See http://dev.clojure.org/jira/browse/CLJ-1527
Next, document and implement support for a much larger set of characters in symbols and keywords, perhaps arbitrary, using #|| syntax, inspired by Common Lisp's || syntax for including arbitrary characters in its symbols.
Since Clojure 1.7.0's reader gives an error if given #|| as input, one approach to preserve some inter-version print/read compatibility is to introduce read support for #|| in one version of Clojure, and only optional print support (which is not the default behavior).
In a later release, e.g. 1 or 2 years later, change the default print behavior to print #|| by default, when the symbol or keyword includes characters that are not on the short list of approved characters. Performance in detecting which symbols and keywords need this treatment would be a factor, and perhaps introducing an internal flag into the Symbol and Keyword classes indicating whether they needed #|| when printing them would be warranted. Options are to set the flag when the symbol/keyword is constructed, or if that would slow down construction too much, it could be determined only when the symbol/keyword is first printed, and cached for future printing.
In yet another later release, change the behavior of reading so that if a symbol/keyword has non-allowed characters outside of #||, it is an error.
Only printing and reading would be affected here, not the behavior of functions like symbol, keyword, intern, etc., which would continue to behave as they do now, allowing everything.
The new printed-as-readable syntax for symbols and keywords with normally-not-allowed characters begins with #|. All characters up to the next | character are part of the symbol or keyword's name. A vertical bar in the keyword/symbol's name is escaped as backslash then vertical bar, and a backslash is escaped as two backslashes. No other characters between #| and the final | require or allow escaping.
TBD: Should the #|| syntax be allowed independently for the namespace and name portions? For example, should #|my weird namespace|/#|my weird name| be supported, even allowing / characters within the namespace and name?
TBD: Probably still need restrictions such as no leading : in symbol names, reserving those to designate keywords, and a few others documented at clojure.org/reader. Those should be explicitly documented here.