38 lines
1.1 KiB
Scheme
38 lines
1.1 KiB
Scheme
|
; Copyright (c) 1993-1999 by Richard Kelsey. See file COPYING.
|
||
|
|
||
|
|
||
|
; Sets of integers implemented as integers.
|
||
|
|
||
|
(define (make-empty-integer-set)
|
||
|
0)
|
||
|
|
||
|
(define (add-to-integer-set set integer)
|
||
|
(bitwise-ior set (arithmetic-shift 1 integer)))
|
||
|
|
||
|
(define integer-set-chunk-size 24)
|
||
|
(define word-mask (- (arithmetic-shift 1 integer-set-chunk-size) 1))
|
||
|
|
||
|
; The nested loop reduces the amount of bignum arithmetic needed (and reduces
|
||
|
; the time by as much as a factor of 10).
|
||
|
|
||
|
(define (map-over-integer-set proc set)
|
||
|
(do ((set set (arithmetic-shift set (- integer-set-chunk-size)))
|
||
|
(i 0 (+ i integer-set-chunk-size))
|
||
|
(l '() (do ((set (bitwise-and set word-mask) (arithmetic-shift set -1))
|
||
|
(j 0 (+ j 1))
|
||
|
(l l (if (odd? set)
|
||
|
(cons (proc (+ i j)) l)
|
||
|
l)))
|
||
|
((or (= 0 set) (>= j integer-set-chunk-size))
|
||
|
l))))
|
||
|
((= 0 set)
|
||
|
(reverse l))))
|
||
|
|
||
|
(define integer-set-and bitwise-and)
|
||
|
(define integer-set-ior bitwise-ior)
|
||
|
(define integer-set-not bitwise-not)
|
||
|
|
||
|
(define (integer-set-subtract set1 set2)
|
||
|
(bitwise-and set1 (bitwise-not set2)))
|
||
|
|
||
|
(define integer-set-equal? =)
|