;; maybe one way of doing OO-like stuff using records?

(include "lib/core.scm")
(include "lib/pair.scm")

(define (make-counter)
  (let ((val 0))
    (define (next)
      (let ((r val))
	(set! val (+ val 1))
	r)
      )
    {next=next}
    ))

(define (n-counters n)
  (let loop ((n n) (l (list:nil)))
    (if (zero? n)
	l
	(loop (- n 1) (list:cons (make-counter) l)))))

(printn (n-counters 5))

(let ((x (make-counter))
      (y (make-counter)))
  (printn (x.next))
  (printn (x.next))
  (printn (x.next))
  (printn (x.next))
  (printn (x.next))
  (printn (x.next))
  (printn (y.next))
  (printn (y.next))
  (printn (y.next))
  (printn (y.next))
  (printn (y.next))
  (printn (y.next))
  )