(define (make-eq-map) (define alist '()) (define interned-alist '()) (define counter 0) (lambda (msg obj) (case msg ((contains?) (assq obj alist)) ((cycle-counter) (set! interned-alist (cons obj interned-alist)) (let ((num (cdr (assq obj alist)))) (string->symbol (string-append "#" (number->string num) "#")))) ((cycle-used?) (memq obj interned-alist)) ((intern!) (set! alist (cons (cons obj counter) alist)) (set! counter (+ counter 1))) (else (error 'make-eq-map "invalid message" msg)))))