     (args     . ,(apply-partially 'nth 1))
     (ids      . ,#'psl--tuck)
     (exprs    . ,#'psl--tuck)
-    (funcall  . ,(lambda (call) (apply #'psl--funcall call)))
+    (funcall  . ,(lambda (call)
+                   `(funcall ,(nth 0 call) ,@(nth 1 call))))
     (aexprs   . ,#'psl--tuck)
     (block    . ,(lambda (exprs) (cons 'progn (nth 1 exprs))))
     (true     . ,(lambda (true) t))
-    (false    . ,(lambda (false) '(not t))) ; can't return nil
+    (false    . ,(lambda (false) nil))
     (pair     . ,(lambda (pair) (cons (nth 0 pair) (nth 2 pair))))
-    (pairs    . ,(lambda (pairs)
-                   (if (stringp (nth 1 pairs))
-                       (list (car pairs))
-                     (cons (car pairs) (cadadr pairs)))))
+    (pairs    . ,(lambda (pairs) (cons (car pairs) (cadadr pairs))))
     (object   . ,(lambda (obj)
                    (let ((fields (nth 1 obj)))
-                     (if (stringp fields)
-                         '(list (quote object))
-                       `(list 'object ,@(psl-make-object fields))))))
+                     `(list 'object ,@(psl--make-object fields)))))
     (if       . ,(lambda (expr)
                    (destructuring-bind (if cond then else) expr
                      `(if ,cond ,then ,else))))

    (assignm   [index= id] "[+-]=" expr)

    ;; Objects
    (pairs     pair [("," pairs) ""])
    (pair      id ":" expr)
    (object    "{" [pairs ""] "}")
    (index     [pexpr id] [by-id index-str])
    (index=    [pexpr id] [by-id index-str])
    (message   [pexpr id] "@" [index-str field] args)

    (number  . "[0-9]+")
    (string  . "\"\\(?:[^\"\\\\]\\|\\\\.\\)*\"")
    (block     "{" exprs ";?" "}")
    (exprs     expr [(";" exprs) empty])

    ;; Control structures
    (if        "if" expr then else)
