numberizer.scm 745 B

12345678910111213141516171819202122232425262728293031323334353637
  1. (library (numberizer)
  2. (export make-numberizer numberize! numberizer-length clone-numberizer)
  3. (import (chezscheme))
  4. ;; > (define x (make-numberizer))
  5. ;; > (numberize! x 'foo)
  6. ;; 0
  7. ;; > (numberize! x 'bar)
  8. ;; 1
  9. ;; > (numberize! x 'foo)
  10. ;; 0
  11. ;; > (numberize! x 'bar)
  12. ;; 1
  13. ;; > (numberize! x 'baz)
  14. ;; 2
  15. (define (make-numberizer) (box '()))
  16. (define (numberize! nb thing)
  17. (let loop ((i 0) (l (unbox nb)))
  18. (if (null? l)
  19. (begin (set-box! nb (append (unbox nb) (list thing)))
  20. i)
  21. (if (equal? thing (car l))
  22. i
  23. (loop (+ i 1) (cdr l))))))
  24. (define (numberizer-length nb) (length (unbox nb)))
  25. (define (clone-list l)
  26. (map (lambda (x) x) l))
  27. (define (clone-numberizer n)
  28. (box (clone-list (unbox n))))
  29. )