     (assign    . ,(lambda (token assign)
                     (destructuring-bind (lhs eq expr) assign
                       `(setf ,lhs ,expr))))
-    (+         . ,(lambda (token op) (cons 'psl-+ (nth 2 op))))
-    (-         . ,(lambda (token op) (cons 'psl-- (nth 2 op))))
-    (<         . ,(lambda (token op) (cons '< (nth 2 op))))
-    (>         . ,(lambda (token op) (cons '> (nth 2 op))))
-    (==        . ,(lambda (token op) (cons 'psl-== (nth 2 op))))
-    (print     . ,(lambda (token op) (cons 'psl-print (nth 2 op))))
+    (+         . ,(lambda (token op) (psl--funcall 'psl-+ (nth 2 op))))
+    (-         . ,(lambda (token op) (psl--funcall 'psl-- (nth 2 op))))
+    (<         . ,(lambda (token op) (psl--funcall '< (nth 2 op))))
+    (>         . ,(lambda (token op) (psl--funcall '> (nth 2 op))))
+    (==        . ,(lambda (token op) (psl--funcall 'psl-== (nth 2 op))))
+    (print     . ,(lambda (token op) (psl--funcall 'psl-print (nth 2 op))))
     (index     . ,(lambda (token index)
                     (let ((obj (nth 0 index)))
                       `(cdr (assq ,(nth 1 index)

    (pair      id ":" expr)
    (object    "{" [pairs ""] "}")
    (index     [("(" expr ")") id] [by-id index-str])
    (message   [("(" expr ")") id] "@" [index-str field] "(" aexprs ")")
    (by-id     "\\." field)
    (field   . id)
    (index-str "\\[" expr "\\]"))

                                       (nth 1 obj)
                                     obj))))))
    (message   . ,(lambda (token msg)
                    (destructuring-bind (obj at f args) msg
                      (let ((o (if (listp obj) (nth 1 obj) obj)))
                        `(funcall (cdr (assq ,f ,o))
                                  ,@(psl--funcall o args))))))
    (field     . ,(lambda (token field) `(quote ,field)))
    (index-str . ,(lambda (token index) `(intern ,(nth 1 index))))
    (by-id     . ,(lambda (token id) (cadr id))))
  "Syntax tree manipulation functions.")

(defun psl--funcall (f args)
  (if (stringp args)
      (list f)
    (cons f args)))

(defun psl--tuck (token names)
  (if (stringp (nth 1 names))
