(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)
)