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



(defvar psl-token-funcs
  `((expr     . ,(lambda (token expr) (car expr)))
    (pexpr    . ,(lambda (token expr  (nth 1 expr))))
    (number   . ,(lambda (token num)  (string-to-number num)))
    (id       . ,(lambda (token name) (intern name)))
    (deffun   . ,(lambda (token list)
                   (destructuring-bind (deffun id params expr in body) list
                     `(let ((,id (lambda ,(if (stringp params) () params)
                                   ,expr)))
                        ,body))))
    (defvar   . ,(lambda (token list)
                   (destructuring-bind (defvar id eq expr in inexpr) list
