   "Implement ParselTongue's == function."
   (equal a b))
 
+(defun psl-object-p (o)
+  "Return t if argument is ParselTongue object."
+  (and (listp o) (eq (car o) 'object)))
+
 (defun psl-print (o)
   "Implement ParselTongue's print function."
   (cond
-    ((eq o t)       (princ "true" t))
-    ((null o)       (princ "false" t))
-    ((functionp o)  (princ "function" t))
-    ((listp o)      (princ "object" t))
+    ((eq o t)          (princ "true" t))
+    ((null o)          (princ "false" t))
+    ((functionp o)     (princ "function" t))
+    ((psl-object-p o)  (princ "object" t))
     (t (princ o t)))
   o)
 


;; * Operators += and -= not yet implemented
;; * Equality tests are incomplete
;; * The empty object is currently (), so it evaluates to false
;; * Semicolon chaining not supported (outside of { } that is)
;; * At least a couple parser issues (max-lisp-eval-depth errors)
;; * A big pile of semantic issues that I don't know about yet

                        (destructuring-bind (obj field) lhs
                          (let ((obj-sym (gensym)))
                            `(let ((,obj-sym (copy-alist ,obj)))
                               (setcdr (assq ,field (cdr ,obj-sym)) ,expr)
                               ,obj-sym)))))))
    (+         . ,(lambda (token op) (psl--apply 'psl-+ (nth 1 op))))
    (-         . ,(lambda (token op) (psl--apply 'psl-- (nth 1 op))))
