mea culpa on the eval/expr. I did the comments inline for brevity.
I am confused about the $$ examples though, since swear I have worked on production code that literally behaves like that. Maybe they had some extra non-alphanumeric bits. This behaves the way I gave originally
set b a
set (a) 5
puts $($b)
Edit:
I found the production code. There was both puts [expr 3 - $$b]
and puts [subst $$b]
and the Steve example was actually two steps: set nameVariable [subst var$$b]
puts [subst $$nameVariable]