File: integer.scm

package info (click to toggle)
scheme48 1.9.2-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 18,232 kB
  • sloc: lisp: 88,907; ansic: 87,519; sh: 3,224; makefile: 771
file content (77 lines) | stat: -rw-r--r-- 1,793 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
; Part of Scheme 48 1.9.  See file COPYING for notices and license.

; Authors: Richard Kelsey, Jonathan Rees, Martin Gasbichler, Mike Sperber


; Operations on integers.

; These expect their arguments to be integers.

(define integer-add       bignum-add)
(define integer-subtract  bignum-subtract)
(define integer-multiply  bignum-multiply)

(define integer-remainder bignum-remainder)
(define integer-quotient  bignum-quotient)
(define integer-divide    bignum-divide)

(define integer-abs bignum-abs)

; Fixnums and bignums are disjoint.

(define (integer= x y)
  (cond ((and (fixnum? x)
	      (fixnum? y))
	 (fixnum= x y))
	((and (bignum? x)
	      (bignum? y))
	 (bignum= x y))
	(else
	 #f)))

; Positive bignums are greater than all fixnums, negative bignums are less
; than all fixnums.

(define (integer< x y)
  (cond ((fixnum? x)
	 (if (fixnum? y)
	     (fixnum< x y)
	     (bignum-positive? y)))
	((fixnum? y)
	 (not (bignum-positive? x)))
	(else
	 (bignum< x y))))

(define (integer<= x y)
  (not (integer< y x)))

(define (integer> x y)
  (integer< y x))

(define (integer>= x y)
  (not (integer< x y)))

(define integer-arithmetic-shift bignum-arithmetic-shift)

(define integer-bitwise-not  bignum-bitwise-not)

(define integer-bit-count bignum-bit-count)

(define integer-bitwise-and bignum-bitwise-and)

(define integer-bitwise-ior bignum-bitwise-ior)
 
(define integer-bitwise-xor bignum-bitwise-xor)
		
(define (enter-integer x key)
  (if  (or (too-big-for-fixnum? x)
	   (too-small-for-fixnum? x))
       (long->bignum x key)
       (enter-fixnum x)))

(define (enter-unsigned-integer x key)
  (if  (unsigned-too-big-for-fixnum? x)
       (unsigned-long->bignum x key)
       (enter-fixnum (unsigned->integer x))))

(define long-as-integer-size (bignum-bits-to-size 32))