                     (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))))))
+                                  ,@(psl--apply 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)
+(defun psl--apply (f args)
   (if (stringp args)
       (list f)
     (cons f args)))
+
+(defun psl--funcall (f args)
+  `(funcall ,f ,@(if (stringp args) () args)))
 
 (defun psl--tuck (token names)
   (if (stringp (nth 1 names))

    (params    "(" [ids ""] ")")

    ;; Function application
    (funcall   id args)
    (args      "(" [aexprs ""] ")")
    (aexprs    expr [("," aexprs) ""])


  '((expr      [block defvar deffun number object lambda string
                true false if while for inc-pre inc-post dec-pre dec-post
                assign + - == < > print funcall index message id])
    (pexpr     "(" expr ")")
    (defvar    "defvar" id "=" expr "in" expr)
    (deffun    "deffun" id params expr "in" expr)
    (lambda    "lambda" params expr)
