 
 ;; * Semicolon chaining not supported (outside of { } that is)
 ;; * Loops return the wrong value
-;; * No "Multiply-defined fields" check
 ;; * Probably some evaluation order mistakes
 ;; * Object equality broken again.
 ;; * Environment not quite right: defvar functions can recurse

    (block    . ,(lambda (token exprs) (cons 'progn (nth 1 exprs))))
    (true     . ,(lambda (token true) t))
    (false    . ,(lambda (token false) '(not t))) ; can't return nil
    (pair     . ,(lambda (token pair)
                   `(cons (quote ,(nth 0 pair)) ,(nth 2 pair))))
    (pairs    . ,#'psl--tuck)
    (object   . ,(lambda (token obj)
                   (let ((fields (nth 1 obj)))
                     (if (stringp fields)
                         '(list (quote object))
                       `(list 'object ,@fields)))))
    (if       . ,(lambda (token expr)
                   (destructuring-bind (if cond then expra else exprb) expr
                     `(if ,cond ,expra ,exprb))))

      (list (car names))
    (cons (car names) (cadadr names))))

(defun psl-make-object (fields)
  (if (null fields)
      ()
    (if (assq (caar fields) (cdr fields))
        '((error "Multiply-defined fields"))
      (cons `(cons (quote ,(caar fields)) ,(cdar fields))
            (psl-make-object (cdr fields))))))

;;; Parser functions

(defvar mpd-best (cons 0 0)
