title: Why does calling `make-instance` in `let` work differently?
body: <p>I'm exploring some possibilities of Common Lisp syntax and I wanted to make an <code>:around</code> method on <code>make-instance</code> to return some arbitrary value in some cases. For sake of simplicity, let it be <code>nil</code>, when I don't pass a needed argument. And it works, but not when calling in let:</p>
  
  <pre><code>(defclass foo ()
    ((bar :initarg := :initform '())))
  
  (defmethod make-instance :around ((type (eql 'foo)) &amp;key =)
    (if (not =) nil (call-next-method)))
  
  (print (make-instance 'foo))    ;; =&gt; NIL
  
  (print (let ((x (make-instance 'foo))) x)) ;; =&gt; #&lt;FOO {10037EEDF3}&gt; 
  </code></pre>
  
  <p>Can somebody explain this situation? Why is that so? Does SBCL try to be smart or is it actually a standard thing to be done? I know that I can work around it by using apply:</p>
  
  <pre><code>(print (let ((x (apply #'make-instance (list 'foo)))) x)) ;; =&gt; NIL
  </code></pre>
  
  <p>But I don't want to rely on this sort of workaround. Actually I can use a regular function for that and it's OK, but I want to understand why it works this way and if this behaviour can be disabled.</p>