     (params    "(" [ids ""] ")")
 
     ;; Function application
-    (funcall   id args)
+    (funcall   [block index pexpr 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])
    (defvar    "defvar" id "=" expr "in" expr)
    (deffun    "deffun" id params expr "in" expr)
    (lambda    "lambda" params expr)


(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
