;; polymorphic variant lists

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

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

(let ((l (:cons 1 (:cons 2 (:cons 3 (:nil))))))
  (length l))