elisp macro expansion local variable
<p>I get touch on elisp recently and try to understand the how elisp macro works.
The GNU tutorial has a <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Surprising-Local-Vars.html#Surprising-Local-Vars" rel="nofollow">chapter Surprising-local-Vars</a> for macro local variable and I am get confused about how the macro expansion works.</p>

<pre><code>(defmacro for (var from init to final do &amp;rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  (let ((tempvar (make-symbol "max")))
    `(let ((,var ,init)
           (,tempvar ,final))
       (while (&lt;= ,var ,tempvar)
         ,@body
         (inc ,var)))))
</code></pre>

<p>There are two let forms. the first one</p>

<pre><code>(let ((tempvar (make-symbol "max")))
</code></pre>

<p>doesn't has the backquote, which will get evaluated at macro expand phrase, therefor the uninterned symbol "max" will get created only at that phrase. 
And the uninterned symbol "max" will get lost at runtime, it should not work right?</p>

<p>But actually, it works well. I tried the following:</p>

<pre><code>(for max from 1 to 10 do (print max))
</code></pre>

<p>And the its expansion as following:</p>

<pre><code>(macroexpand '(for max from 1 to 10 do (print max)))

(let ((max 1) (max 10)) (while (&lt;= max max) (print max) (setq max (+ 1 max))))
</code></pre>

<p>two max symbol here, one bound to 1, another bound to 10, the while form expression has two max symbol.</p>

<pre><code>(while (&lt;= max max)
</code></pre>

<p>how does the while form resolve the two different the symbol "max"?</p>