Remember that (La)TeX is a macro programming language that has this quirky thing called "expansion". For example, if
\newcommand{\aaa}{a}
then \aaa expands to a. Alternatively put, a is the "replacement text" for \aaa. In a definition of
\let\oldaaa\aaa
\renewcommand{\aaa}{\oldaaa b} % now \aaa is ab
you are copying the definition of \aaa into \oldaaa (effectively similar to \def\oldaaa{<whatever \aaa is>}, but not the same as \def\oldaaa{\aaa}), followed by a redefinition of \aaa into \oldaaa b. During expansion - when you write \aaa, this is replaced by \oldaaa b, and since you \let\oldaaa\aaa, this is replaced by \aaa b, which is circular. Here's a stepwise showcase:
\newcommand{\aaa}{a}
\let\oldaaa\aaa
\renewcommand{\aaa}{\oldaaa b}
> \aaa
> \oldaaa b % Expansion of \aaa
> \aaa b % Expansion of \oldaaa
> \oldaaa b b % Expansion of \aaa
> \aaa b b % Expansion of \oldaaa
> \oldaaa b b b % Expansion of \aaa
> ...
What I think you're after is expanding the contents at the time of redefinition, which would look like this:
\newcommand{\aaa}{a}
\expandafter\renewcommand\expandafter\aaa\expandafter{\aaa b} % now \aaa is ab
\expandafter\renewcommand\expandafter\aaa\expandafter{\aaa c} % now \aaa should be abc
Note that since the replacement text of \aaa is expanded before making the assignment, so there's no need for using an additional macro like \oldaaa. This would also only work if the contents at redefinition is expandable itself.
\lethas\oldaaareferencing itself by way of\aaa. Remember,\letand\defare not the same. Depending on what you are stuffing in there, replacing the first\renewcommandwith an\edefshould wipe the slate clean, freeing up\oldaaa– Steven B. Segletes Mar 14 '13 at 01:31\apptocommand suggested by @egreg. – nplatis Mar 15 '13 at 07:43