 ;;; Known bugs:
 
 ;; * Assignment is an issue right now
-;;   * Objects are mutable (object assignment semantics are wrong)
 ;;   * Operators += and -= not yet implemented
 ;; * Equality tests are incomplete
 ;; * The empty object is currently (), so it evaluates to false

                      `(prog1 ,id (setq ,id (1- ,id))))))
    (assign    . ,(lambda (token assign)
                    (destructuring-bind (lhs eq expr) assign
                      `(setf ,lhs ,expr))))
    (+         . ,(lambda (token op) (psl--apply 'psl-+ (nth 1 op))))
    (-         . ,(lambda (token op) (psl--apply 'psl-- (nth 1 op))))
    (<         . ,(lambda (token op) (psl--apply '< (nth 1 op))))

    (inc-post  id "++")
    (dec-pre   "--" id)
    (dec-post  id "--")
    (assign    [index= id] "=" expr)

    ;; Objects
    (pairs     pair [("," pairs) ""])
    (pair      id ":" expr)
    (object    "{" [pairs ""] "}")
    (index     [pexpr id] [by-id index-str])
    (index=    [pexpr id] [by-id index-str])
    (message   [pexpr id] "@" [index-str field] args)
    (by-id     "\\." field)
    (field   . id)
