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

                                       (nth 1 obj)
                                     obj))))))
    (message   . ,(lambda (token msg)
                    (destructuring-bind (obj at f ps args pe) msg
                      (let ((o (if (listp obj) (nth 1 obj) obj)))
                        `(funcall (cdr (assq ,f ,o)) ,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--tuck (token names)
  (if (stringp (nth 1 names))

                     `(let ((,id ,expr)) ,inexpr))))
    (string   . ,(lambda (token string) (read string)))
    (params   . ,(lambda (token params) (nth 1 params)))
    (args     . ,(lambda (token args) (nth 1 args)))
    (ids      . ,#'psl--tuck)
    (exprs    . ,(lambda (token exprs) (psl--tuck token exprs)))
    (funcall  . ,(lambda (token call) (psl--funcall (nth 0 call) (nth 1 call))))
    (aexprs   . ,(lambda (token exprs) (psl--tuck token exprs)))
    (block    . ,(lambda (token exprs) (cons 'progn (nth 1 exprs))))
    (true     . ,(lambda (token true) t))
