     (params    "(" [ids ""] ")")
 
     ;; Function application
-    (funcall   id args)
+    (funcall   [block index pexpr id] args)
     (args      "(" [aexprs ""] ")")
     (aexprs    expr [("," aexprs) ""])
 


(defvar psl-token-funcs
  `((expr     . ,(lambda (token expr) (car 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
                     `(flet ((,id ,(if (stringp params) () params) ,expr))
                        ,body))))
    (defvar   . ,(lambda (token list)
                   (destructuring-bind (defvar id eq expr in inexpr) list

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