Without the quote eval will be evaluating the result of calling (print state) instead of evaluating the actual symbols.
Your suggested fix resolves state before eval is called. The rest of the examples don't do that.
Actually... The tcl example does do that. But just add a \ before the $ and it won't and it will still work.