Wrap non-trivial functions with parenthesis
[jscl.git] / src / compiler-codegen.lisp
index 14113c6..166c7f9 100644 (file)
        (js-format "~a" (apply #'code args)))
       ;; Function call
       (call
-       (js-expr (car args))
+       (if (symbolp (car args))
+           (js-expr (car args))
+           (progn
+             (js-format "(")
+             (js-expr (car args))
+             (js-format ")")))
        (js-format "(")
        (when (cdr args)
-         (with-operator (13 'left)
+         (with-operator (12 'left)
            (js-expr (cadr args))
            (dolist (operand (cddr args))
              (let ((*js-output* t))
                  (js-expr condition)
                  (js-format ")")
                  (js-stmt `(progn ,@body))))
+           (for
+            (destructuring-bind ((start condition step) &body body) (cdr form)
+              (js-format "for (")
+              (js-expr start)
+              (js-format ";")
+              (js-expr condition)
+              (js-format ";")
+              (js-expr step)
+              (js-format ")")
+              (js-stmt `(progn ,@body))))
+           (for-in
+            (destructuring-bind ((x object) &body body) (cdr form)
+              (js-format "for (")
+              (js-identifier x)
+              (js-format " in ")
+              (js-expr object)
+              (js-format ")")
+              (js-stmt `(progn ,@body))))
            (try
             (destructuring-bind (&rest body) (cdr form)
               (js-format "try")