These two forms seem like they ought to generate the same code, but don't:
(defun foo () (when (bar) (baz)))
function foo() { return bar() ? baz() : null; };
(defun foo () (when (bar) (let () (baz))))
function foo() { if (bar()) { return baz(); }; };
Although one wouldn't write an empty LET by hand, macros that accumulate bindings sometimes emit them. If those macros are widely used in a program, one can lose quite a few desirable 'expressionizations' this way. I've committed a patch (see below) to tweak the function TRY-EXPRESSIONIZING-IF? into exempting empty LETs from the nesting heuristic it uses to decide what to expressionize. Vladimir, please revise or revert it I did it wrong.
This came up because I'm trying to port my code to use the MAYBE-ONCE-ONLY macro introduced in a5cf0df, rather than a similar one I wrote. I'll post about that momentarily.
Daniel
diff --git a/src/special-operators.lisp b/src/special-operators.lisp index 0267133..799d70f 100644 --- a/src/special-operators.lisp +++ b/src/special-operators.lisp @@ -222,7 +222,8 @@ (try-expressionizing-if? (or (ignore-errors (ps-macroexpand x)) x) ;; fail (+ score (case (car exp) - ((if cond let) 1) + ((if cond) 1) + (let (if (second exp) 1 0)) ;; ignore empty binding list ((progn) (1- (length (cdr exp)))) (otherwise 0)))))) (t t)))