Skip to content

Commit 8f7081e

Browse files
committed
Add most of the remaining numeric types
1 parent 673ee08 commit 8f7081e

File tree

3 files changed

+42
-20
lines changed

3 files changed

+42
-20
lines changed

scheme-core.lisp

-12
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,6 @@ in a form that CL expects.
4343
"Interns a Scheme symbol using one package, with its case inverted."
4444
(intern (invert-case string) '#:r7rs))
4545

46-
(define-function (nanp :inline t) ((number number))
47-
"Tests if a number is NaN"
48-
(and (floatp number) (f:float-nan-p number)))
49-
50-
(define-function (infinitep :inline t) ((number number))
51-
"Tests if a number is an infinity"
52-
(and (floatp number) (f:float-infinity-p number)))
53-
54-
(define-function (finitep :inline t) ((number number))
55-
"Tests if a number is both not NaN and not an infinity"
56-
(not (and (floatp number) (or (infinitep number) (nanp number)))))
57-
5846
(defun coerce-subseq (sequence result-type &optional start end)
5947
"Coerces a subsequence into the result type"
6048
(let ((subseq (if start

scheme-types.lisp

+38-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,24 @@
22

33
(in-package #:airship-scheme)
44

5-
;;;; Define type definitions
5+
;;;; Helper functions useful for SATISFIES types or standalone tests
6+
7+
(define-function (mathematical-integer-p :inline t) ((number number))
8+
(zerop (nth-value 1 (round number))))
9+
10+
(define-function (nanp :inline t) ((number number))
11+
"Tests if a number is NaN"
12+
(and (floatp number) (f:float-nan-p number)))
13+
14+
(define-function (infinitep :inline t) ((number number))
15+
"Tests if a number is an infinity"
16+
(and (floatp number) (f:float-infinity-p number)))
17+
18+
(define-function (finitep :inline t) ((number number))
19+
"Tests if a number is both not NaN and not an infinity"
20+
(not (and (floatp number) (or (infinitep number) (nanp number)))))
21+
22+
;;;; Type definitions
623

724
;;;; TODO: The define-scheme-predicate could go here, too
825
(defmacro %define-scheme-type ((name &rest lambda-list) predicate &body body)
@@ -40,7 +57,15 @@
4057
(define-scheme-type (rational?)
4158
'(or rational float))
4259

43-
;;; TODO: integer?
60+
(define-scheme-type (integer?)
61+
"
62+
A Scheme integer? is a mathematical integer, which means that it is
63+
either a CL integer or it is a number (probably a float) that
64+
satisfies the mathematical definition of an integer. Since this is a
65+
SATISFIES type, it should be used sparingly.
66+
"
67+
`(or integer
68+
(and number (satisfies mathematical-integer-p))))
4469

4570
(define-scheme-type (exact?)
4671
"An exact number might be real or complex, but is not a float."
@@ -56,8 +81,18 @@
5681
(define-scheme-type (exact-integer?)
5782
`integer)
5883

84+
(define-scheme-type* (finite?) finitep
85+
`(satisfies finitep))
86+
87+
(define-scheme-type* (infinite?) infinitep
88+
`(satisfies infinitep))
89+
90+
(define-scheme-type* (nan?) nanp
91+
`(satisfies nanp))
92+
5993
(define-scheme-type* (zero?) zerop
60-
'(or (real 0 0) (complex (real 0 0))))
94+
`(or (real 0 0)
95+
(complex (real 0 0))))
6196

6297
(define-scheme-type (boolean?)
6398
"

standard-procedures.lisp

+4-5
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@
5151
(rational? obj))
5252

5353
(define-scheme-predicate (integer? obj)
54-
(or (integerp obj)
55-
(and (numberp obj) (zerop (nth-value 1 (round obj))))))
54+
(integer? obj))
5655

5756
(define-scheme-predicate (exact? z)
5857
(exact? z))
@@ -64,13 +63,13 @@
6463
(exact-integer? z))
6564

6665
(define-scheme-predicate (finite? z)
67-
(finitep z))
66+
(finite? z))
6867

6968
(define-scheme-predicate (infinite? z)
70-
(infinitep z))
69+
(infinite? z))
7170

7271
(define-scheme-predicate (nan? z)
73-
(nanp z))
72+
(nan? z))
7473

7574
;;; Basic numerical procedures
7675

0 commit comments

Comments
 (0)