     (inc-post  id "++")
     (dec-pre   "--" id)
     (dec-post  id "--")
-    (assign    [index id] "=" expr)
+    (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)

;;; 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
                      (if (symbolp lhs)
                          `(setq ,lhs ,expr)
                        (destructuring-bind (obj field) lhs
                          (let ((obj-sym (gensym)))
                            `(let ((,obj-sym (copy-alist ,obj)))
                               (setcdr (assq ,field ,obj-sym) ,expr)
                               ,obj-sym)))))))
    (+         . ,(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))))
