hashtable.scm 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. ;; R6RS hashtable functions:
  3. ;; default size of a hashtable
  4. (define *hashtable-default-init-size* 20)
  5. ;; constructors
  6. (define make-eq-hashtable
  7. (opt-lambda ((size *hashtable-default-init-size*))
  8. (make-eq-tlc-table size)))
  9. (define make-eqv-hashtable
  10. (opt-lambda ((size *hashtable-default-init-size*))
  11. (make-eqv-tlc-table size)))
  12. (define make-hashtable
  13. (opt-lambda (hash-function equiv (size *hashtable-default-init-size*))
  14. (make-non-default-tlc-table hash-function equiv size #f)))
  15. ;; predicate
  16. (define (hashtable? hashtable)
  17. (tlc-table? hashtable))
  18. ;; size
  19. (define (hashtable-size hashtable)
  20. (tlc-table-size hashtable))
  21. ;; getter
  22. (define (hashtable-ref hashtable key default)
  23. (tlc-table-ref hashtable key default))
  24. ;; setter
  25. (define (hashtable-set! hashtable key obj)
  26. (assert-key-equiv/hash-fun hashtable key)
  27. (tlc-table-set! hashtable key obj))
  28. ;; delete
  29. (define (hashtable-delete! hashtable key)
  30. (tlc-table-delete! hashtable key #f))
  31. ;; contains
  32. (define (hashtable-contains? hashtable key)
  33. (tlc-table-contains? hashtable key))
  34. ;; update
  35. (define (hashtable-update! hashtable key proc default)
  36. (assert-key-equiv/hash-fun hashtable key)
  37. (tlc-table-update! hashtable key proc default))
  38. ;; copy
  39. (define hashtable-copy
  40. (opt-lambda (hashtable (mutable? #f))
  41. (tlc-table-copy hashtable mutable?)))
  42. ;; clear
  43. (define hashtable-clear!
  44. (opt-lambda (hashtable (k #f))
  45. (tlc-table-clear! hashtable)
  46. (if k
  47. (tlc-table-resize! hashtable k))))
  48. ;; inspection
  49. (define (hashtable-keys hashtable)
  50. (tlc-table-keys hashtable))
  51. (define (hashtable-entries hashtable)
  52. (tlc-table-entries hashtable))
  53. ;; hash functions
  54. (define (hashtable-equivalence-function hashtable)
  55. (tlc-table-equivalence-function hashtable))
  56. (define (hashtable-hash-function hashtable)
  57. (tlc-table-hash-function hashtable))
  58. (define (hashtable-mutable? hashtable)
  59. (not (immutable? hashtable)))
  60. ;; check restrictions on hash-function and equiv
  61. (define (key-equiv/hash-fun-checker hashtable key)
  62. (let* ((equiv (hashtable-equivalence-function hashtable))
  63. (hash-fun (hashtable-hash-function hashtable)))
  64. (values (eq? (hash-fun key) (hash-fun ((lambda (e) e) key)))
  65. (cond ((string? key) (equiv key ((lambda(k) k) key)))
  66. ((pair? key) (equiv key key))
  67. ((list? key) (equiv key key))
  68. ((symbol? key) (equiv 'test 'test))
  69. ((number? key) (equiv 8.8 8.8))
  70. (else #t))
  71. hash-fun equiv)))
  72. ;; assert restrictions
  73. (define (assert-key-equiv/hash-fun hashtable key)
  74. (call-with-values
  75. (lambda () (key-equiv/hash-fun-checker hashtable key))
  76. (lambda (valid-to-hashfun valid-to-equiv hash-fun equiv)
  77. (if (not valid-to-hashfun)
  78. (assertion-violation 'assert-key-equiv/hash-fun
  79. "key does not work correctly with hash-fun"
  80. key hash-fun))
  81. (if (not valid-to-equiv)
  82. (assertion-violation 'assert-key-equiv/hash-fun
  83. "key does not work correctly with equiv"
  84. key equiv)))))