(datatype list
  (:nil)
  (:cons 'a (list 'a))
  )

(datatype symbol (:t string))

(define (eq? a b)
  (%%cexp ('a 'a -> bool) "%0==%1" a b))

(define parse
  ()          -> 0
  ('expr . _) -> 1
  _           -> 2
  )

(define (printn x)
  (%%cexp ('a -> undefined) "dump_object (%0, 0); fprintf (stdout, \"\\n\")" x))

(let ((x '(expr a b c)))
  (printn x)
  (parse x))