-;; Initialized to any value larger than any operator precedence
-(defvar *js-operator-precedence* 1000)
-(defvar *js-operator-associativity* 'left)
-(defvar *js-operand-order* 'left)
-
-;; Format an expression optionally wrapped with parenthesis if the
-;; precedence rules require it.
-(defmacro with-operator ((precedence associativity) &body body)
- (let ((g!parens (gensym))
- (g!precedence (gensym)))
- `(let* ((,g!precedence ,precedence)
- (,g!parens
- (cond
- ((> ,g!precedence *js-operator-precedence*))
- ((< ,g!precedence *js-operator-precedence*) nil)
- ;; Same precedence. Let us consider associativity.
- (t
- (not (eq *js-operand-order* *js-operator-associativity*)))))
- (*js-operator-precedence* ,g!precedence)
- (*js-operator-associativity* ,associativity)
- (*js-operand-order* 'left))
- (when ,g!parens (js-format "("))
- (progn ,@body)
- (when ,g!parens (js-format ")")))))
-
-(defun js-operator (string)
- (js-format "~a" string)
- (setq *js-operand-order* 'right))
-
-(defun js-operator-expression (op args)