(define (make-eq-map) (define counter-table (make-hash-table (make-eq-comparator))) (define used-table (make-hash-table (make-eq-comparator))) (define counter 0) (lambda (msg obj) (case msg ((contains?) (hash-table-contains? counter-table obj)) ((cycle-counter) (let ((num (hash-table-ref counter-table obj))) (hash-table-set! used-table obj #t) (string->symbol (string-append "#" (number->string num) "#")))) ((cycle-used?) (hash-table-contains? used-table obj)) ((intern!) (hash-table-set! counter-table obj counter) (set! counter (+ counter 1))) (else (error "invalid message" msg)))))