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

    (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 "\\]"))

                     `(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))
