<div dir="ltr"><span style="font-family: courier new,monospace;">I got bitten by this bug:</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  (ps (or x (if (= x 0) "zero" "empty")))</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">   => "x || x == 0 ? 'zero' : 'empty'"</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">This is wrong, because it evaluates to 'zero' for any value of x, instead of just when x is 0. The correct expansion is:</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  x || (x == 0 ? 'zero' : 'empty')</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">It seems that Parenscript simply has JS operator precedence wrong for the "if" (question-mark) operator. The following web page (which claims to be reporting what the ECMA spec says) makes it clear that the "if" operator's precedence is between that of "or" and the assignment operators.</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"><a href="http://www.codehouse.com/javascript/precedence/">http://www.codehouse.com/javascript/precedence/</a></span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">So a simple fix is:</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">hunk ./src/printer.lisp 110</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-                   (in js-expression-if)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+                   (in)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">hunk ./src/printer.lisp 118</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+           (js-expression-if)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Daniel</span><br style="font-family: courier new,monospace;"></div>