Nope.  That&#x27;s the reason for wrapping THEN and ELSE inside lambdas, to delay the evaluation until after one of them is selected.  Try it.<p>[UPDATE]<p>You have to make some minor tweaks to my original code to make it work.  Here&#x27;s a fully tested version:<p><pre><code>    (defun _true (then else) then)
    
    (defun _false (then else) else)
    
    (defmacro _if (condition then else)
      `(funcall (funcall ,condition (lambda () ,then) (lambda () ,else))))
    
    (setf (get t &#x27;altboolean) &#x27;_true)
    
    (setf (get nil &#x27;altboolean) &#x27;_false)
    
    (defun -&gt;altboolean (condition) (get condition &#x27;altboolean))
    
    (defun _fact (n)
      (_if (-&gt;altboolean (&lt;= n 1)) 1 (* n (_fact (1- n)))))</code></pre>