z-set.scm 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. ; Sets of integers implemented as integers.
  4. (define (make-empty-integer-set)
  5. 0)
  6. (define (add-to-integer-set set integer)
  7. (bitwise-ior set (arithmetic-shift 1 integer)))
  8. (define integer-set-chunk-size 24)
  9. (define word-mask (- (arithmetic-shift 1 integer-set-chunk-size) 1))
  10. ; The nested loop reduces the amount of bignum arithmetic needed (and reduces
  11. ; the time by as much as a factor of 10).
  12. (define (map-over-integer-set proc set)
  13. (do ((set set (arithmetic-shift set (- integer-set-chunk-size)))
  14. (i 0 (+ i integer-set-chunk-size))
  15. (l '() (do ((set (bitwise-and set word-mask) (arithmetic-shift set -1))
  16. (j 0 (+ j 1))
  17. (l l (if (odd? set)
  18. (cons (proc (+ i j)) l)
  19. l)))
  20. ((or (= 0 set) (>= j integer-set-chunk-size))
  21. l))))
  22. ((= 0 set)
  23. (reverse l))))
  24. (define integer-set-and bitwise-and)
  25. (define integer-set-ior bitwise-ior)
  26. (define integer-set-not bitwise-not)
  27. (define (integer-set-subtract set1 set2)
  28. (bitwise-and set1 (bitwise-not set2)))
  29. (define integer-set-equal? =)