hashtable.scm 3.1 KB

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