(datatype bool (:true) (:false))

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

(define (+ a b)
  (%%cexp (int int -> int) "%0+%1" a b))

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

(define (length l)
  (let loop ((l l) (r 0))
    (vcase list l
       ((:nil) r)
       ((:cons _ tl) (loop tl (+ r 1))))))

(let ((l0 (list:cons 1 (list:cons 2 (list:cons 3 (list:cons 4 (list:nil))))))
      (l1 (list:nil))
      )
  (printn l0)
  (printn (length l0))
  (set! l1 (list:cons #t l1))
  (printn l1)
  )