title: How does `if` not evaluate all its arguments?
body: <p>I'm trying to learn and understand the Lisp programming language to a deep level. The function <code>+</code> evaluates its arguments in applicative order:</p>
  
  <pre><code>(+ 1 (+ 1 2))
  </code></pre>
  
  <p><code>(+ 1 2)</code> will be evaluated and then <code>(+ 1 3)</code> will be evaluated, but the <code>if</code> function works differently:</p>
  
  <pre><code>(if (&gt; 1 2) (not-defined 1 2) 1)
  </code></pre>
  
  <p>As the form <code>(not-defined 1 2)</code> isn't evaluated, the program doesn't break.</p>
  
  <p>How can the same syntax lead to different argument evaluation? How is the <code>if</code> function defined so that its arguments aren't evaluated?</p>