For the sake of coping with implicit space when doing \let I suggest s.th. like this:
\def\redefine#1{% \expandafter\futurelet\csname\string#1\endcsname\def#1% }% \def\exchange#1#2{#2#1}% \def\recover#1{% \expandafter\exchange\expandafter{\csname\string#1\endcsname}{\let#1= }% }% \def\foobar{foo} \foobar \redefine\foobar{bar} \foobar \recover\foobar \foobar \bigskip Doing the implicit space game: \bigskip \exchange{ }{\let\foobar= }% A\foobar A \redefine\foobar{bar} B\foobar B \recover\foobar C\foobar C \bye Alternatively just do some scoping via \begingroup..\endgroup or {..}:
\def\foobar{foo}% \foobar \begingroup \def\foobar{bar}% \foobar \endgroup \foobar {% \def\foobar{bar}% \foobar }% \foobar \bye 
