# What could go wrong if I don't use \detokenize when creating macro names using macro arguments?

I was in correspondence with the author of a LaTeX package in which I volunteered code similar to the following (I have anonymised it so that it is not obvious what package):

\makeatletter
\newcommand{\savemacrostatewithname}[1]{%
\expandafter\let%
\csname saved@macro@state@named@#1\endcsname%
\package@internal@macro%
}
\newcommand{\restoremacrostatewithname}[1]{%
\ifcsname saved@macro@state@named@#1\endcsname%
\else%
\errmessage{Saved macro state named "#1" doesn't exist}%
\fi%
\expandafter\let%
\expandafter\package@internal@macro%
\csname saved@macro@state@named@#1\endcsname%
}
\makeatother


In their reply, one thing they said was that instead of writing #1 in your macros, you should write \detokenize{#1}, as it is safer. Why is it safer? What might go wrong if I don't?

-
If you're sure that #1 will always be replaced with a string of ASCII characters, there's no difference. –  egreg Jan 18 '14 at 13:41
@egreg 'Sure' is a risky business ;-) –  Joseph Wright Jan 18 '14 at 15:26
@JosephWright People who monkey with category codes are on their own. –  egreg Jan 18 '14 at 15:39
@egreg User input can legitimately contain ~ or _  with the underscore package loaded :-) –  Joseph Wright Jan 18 '14 at 15:57
@JosephWright Let's say non TeX special characters, then; I don't consider underscore that creates more problems than it solves. –  egreg Jan 18 '14 at 16:00

\catcode\!=\active

then \csname foo!\endcsname is an error as the name doesn't expand to a sequence of character tokens, but \csname\detokenize{foo!}\endcsname is same as \csname foo\string!\endcsname and makes the token with name foo!`