 
     ;; Identifiers
     (id      . "[a-zA-Z]+")
-    (ids       id [("," ids) ""])
-    (params    "(" [ids ""] ")")
+    (ids       id [("," ids) empty])
+    (params    "(" [ids empty] ")")
 
     ;; Function application
     (funcall   [block index pexpr id] args)
-    (args      "(" [aexprs ""] ")")
-    (aexprs    expr [("," aexprs) ""])
+    (args      "(" [aexprs empty] ")")
+    (aexprs    expr [("," aexprs) empty])
 
     ;; Builtins
     (+         "+" args)


(defvar psl-token-funcs
  `((expr     . ,#'identity)
    (pexpr    . ,(apply-partially 'nth 1))
    (number   . ,#'string-to-number)
    (id       . ,#'intern)
    (deffun   . ,(lambda (list)
                   (destructuring-bind (deffun id params expr in body) list
                     `(let ((,id (lambda ,(if (stringp params) () params)
                                   ,expr)))
                        ,body))))
    (defvar   . ,(lambda (list)
                   (destructuring-bind (defvar id eq expr in body) list

                               (,op (cdr (or (assq ,field (cdr ,obj))
                                         (error "Field not found: %s" ,field)))
                                    ,expr) ,obj))))))))
    (+         . ,(lambda (op) (cons 'psl-+ (nth 1 op))))
    (-         . ,(lambda (op) (cons 'psl-- (nth 1 op))))
    (<         . ,(lambda (op) (cons 'psl-< (nth 1 op))))
    (>         . ,(lambda (op) (cons 'psl-> (nth 1 op))))
    (==        . ,(lambda (op) (cons 'psl-== (nth 1 op))))
    (print     . ,(lambda (op) (cons 'psl-print (nth 1 op))))
    (index     . ,(lambda (index)
                    `(cdr (or (assq ,(nth 1 index) (cdr,(nth 0 index)))
                              (error "Field not found: %s" ,(nth 1 index))))))
