Hey, I found that code hard to follow, with the if-then-elses nested 4 deep. A refactor, pretty much untested since I don't use ansi-term:
(defun visit-ansi-term ()
"If the current buffer is:
1) a running ansi-term named *ansi-term*, rename it.
2) a stopped ansi-term, kill it and create a new one.
3) a non ansi-term, go to an already running ansi-term
or start a new one while killing a defunct one."
(interactive)
(let ((is-term (string= "term-mode" major-mode))
(is-ansi-term (string= "*ansi-term*" (buffer-name)))
(is-running (term-check-proc (buffer-name)))
(anon-term (get-buffer "*ansi-term*")))
(cond
((and is-term is-running is-ansi-term)
(call-interactively 'rename-buffer))
((and anon-term (if is-term
(and is-running (not is-ansi-term))
(term-check-proc "*ansi-term*")))
(switch-to-buffer "*ansi-term*"))
(t
(cond ((and is-term (not is-running))
(kill-buffer (buffer-name)))
((and anon-term (not (term-check-proc "*ansi-term*")))
(kill-buffer "*ansi-term*")))
(ansi-term "/usr/local/bin/zsh")))))