Skip to content

Commit f67f696

Browse files
committed
Add a new macro, define-scheme-type
1 parent 0c884df commit f67f696

File tree

3 files changed

+56
-58
lines changed

3 files changed

+56
-58
lines changed

scheme-core.lisp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ rules provided in the r7rs-small specification.
6969
"
7070
(typecase x
7171
(symbol (typecase y (symbol (%symbol= x y))))
72-
(inexact (typecase y (inexact (= x y))))
73-
(exact (typecase y (exact (= x y))))
72+
(inexact? (typecase y (inexact? (= x y))))
73+
(exact? (typecase y (exact? (= x y))))
7474
(character (typecase y (character (char= x y))))
7575
(t (eq x y))))
7676

scheme-types.lisp

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,70 +2,68 @@
22

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

5-
;;;; Type Definitions
6-
7-
(deftype exact ()
5+
;;;; Define type definitions
6+
7+
;;; TODO: The define-scheme-predicate could go here, too
8+
(defmacro define-scheme-type ((name &rest lambda-list) &body body)
9+
(let ((docstring (if (and (stringp (car body)) (cdr body))
10+
(list (car body))
11+
nil)))
12+
`(progn
13+
(deftype ,name ,lambda-list
14+
,@body)
15+
(define-function (,name :inline t) (object)
16+
,@docstring
17+
(and (typep object ',name) t)))))
18+
19+
;;;; Type definitions
20+
21+
(define-scheme-type (exact?)
822
"An exact number might be real or complex, but is not a float."
923
`(or rational (complex rational)))
1024

11-
(deftype exact-integer ()
12-
"An exact-integer in Scheme is just a CL integer."
25+
(define-scheme-type (exact-integer?)
26+
"An exact integer in Scheme is just a CL integer."
1327
`integer)
1428

15-
(deftype inexact ()
29+
(define-scheme-type (inexact?)
1630
"An inexact number is just a float, real or complex."
1731
`(or float (complex float)))
1832

19-
(deftype flonum ()
33+
(define-scheme-type (flonum?)
2034
"A Scheme flonum is just a double-float."
2135
'double-float)
2236

23-
(deftype scheme-boolean ()
37+
(define-scheme-type (boolean?)
2438
"
2539
The two symbols that represent a Scheme Boolean, which externally are
2640
known as #t or #f
2741
"
2842
`(or (eql t) (eql %scheme-boolean:f)))
2943

30-
(deftype scheme-vector ()
44+
(define-scheme-type (vector?)
3145
"A Scheme vector is just a T vector"
3246
`simple-vector)
3347

34-
(deftype scheme-string ()
48+
(define-scheme-type (string?)
3549
"A Scheme string is just a simple string."
3650
'simple-string)
3751

38-
(deftype bytevector ()
52+
(define-scheme-type (bytevector?)
3953
"A Scheme bytevector is just an octet vector"
4054
`(simple-array octet (*)))
4155

42-
;;;; Type Predicates
43-
44-
(define-function (exactp :inline t) (number)
45-
"Tests if a number is exact"
46-
(and (typep number 'exact) t))
47-
48-
(define-function (inexactp :inline t) (number)
49-
"Tests if a number is inexact"
50-
(and (typep number 'inexact) t))
51-
52-
(define-function (scheme-boolean-p :inline t) (object)
53-
"Tests if an object is either a Scheme #t or a Scheme #f"
54-
(and (typep object 'scheme-boolean) t))
55-
56-
(define-function (scheme-symbol-p :inline t) (object)
56+
(define-scheme-type (symbol?)
5757
"Tests if an object is a Scheme symbol"
58-
(and object
59-
(symbolp object)
60-
(not (scheme-boolean-p object))))
58+
`(and symbol (not null) (not boolean?)))
6159

6260
;;;; Type Conversion
6361

6462
(define-function (inexact :inline t) ((z number))
6563
"Converts a number to a Scheme inexact."
6664
(etypecase z
67-
((and complex exact) (coerce z '(complex double-float)))
68-
(exact (coerce z 'double-float))
65+
((and complex exact?) (coerce z '(complex double-float)))
66+
(exact? (coerce z 'double-float))
6967
(number z)))
7068

7169
;;; Note: This uses rationalize. cl:rationalize is not the same thing
@@ -75,7 +73,7 @@ known as #t or #f
7573
(define-function (exact :inline t) ((z number))
7674
"Converts a number to a Scheme exact."
7775
(etypecase z
78-
((and complex inexact) (complex (rationalize (realpart z))
76+
((and complex inexact?) (complex (rationalize (realpart z))
7977
(rationalize (imagpart z))))
80-
(inexact (rationalize z))
78+
(inexact? (rationalize z))
8179
(number z)))

standard-procedures.lisp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@
6060
(and (numberp obj) (zerop (nth-value 1 (round obj))))))
6161

6262
(define-scheme-predicate (exact? z)
63-
(exactp z))
63+
(exact? z))
6464

6565
(define-scheme-predicate (inexact? z)
66-
(inexactp z))
66+
(inexact? z))
6767

6868
(define-scheme-predicate (exact-integer? z)
69-
(integerp z))
69+
(exact-integer? z))
7070

7171
(define-scheme-predicate (finite? z)
7272
(finitep z))
@@ -276,7 +276,7 @@
276276
(eq obj '%scheme-boolean:f))
277277

278278
(define-scheme-predicate (boolean? obj)
279-
(scheme-boolean-p obj))
279+
(boolean? obj))
280280

281281
(define-scheme-predicate (boolean=? . booleans)
282282
(cond ((null booleans) t)
@@ -398,7 +398,7 @@
398398
;;;; 6.5 Symbols
399399

400400
(define-scheme-predicate (symbol? obj)
401-
(scheme-symbol-p obj))
401+
(symbol? obj))
402402

403403
(define-scheme-predicate (symbol=? . symbols)
404404
(apply #'symbol= symbols))
@@ -480,7 +480,7 @@
480480
;;;; 6.7 Strings
481481

482482
(define-scheme-predicate (string? obj)
483-
(typep obj 'scheme-string))
483+
(string? obj))
484484

485485
(define-scheme-procedure (make-string k &optional (char #.(code-char 0)))
486486
(make-string k :initial-element char))
@@ -561,7 +561,7 @@
561561
;;;; 6.8 Vectors
562562

563563
(define-scheme-predicate (vector? obj)
564-
(typep obj 'scheme-vector))
564+
(vector? obj))
565565

566566
(define-scheme-procedure (make-vector k &optional (fill nil))
567567
(make-array k :initial-element fill))
@@ -570,7 +570,7 @@
570570
(apply #'vector obj))
571571

572572
(define-scheme-procedure (vector-length vector)
573-
(check-type vector scheme-vector)
573+
(check-type vector vector?)
574574
(length vector))
575575

576576
(define-scheme-procedure (vector-ref vector k)
@@ -580,39 +580,39 @@
580580
(setf (svref vector k) obj))
581581

582582
(define-scheme-procedure (vector->list vector &optional start end)
583-
(check-type vector scheme-vector)
583+
(check-type vector vector?)
584584
(coerce-subseq vector 'list start end))
585585

586586
(define-scheme-procedure (list->vector list)
587-
(coerce list 'scheme-vector))
587+
(coerce list 'vector?))
588588

589589
(define-scheme-procedure (vector->string vector &optional start end)
590-
(check-type vector scheme-vector)
590+
(check-type vector vector?)
591591
(coerce-subseq vector 'string start end))
592592

593593
(define-scheme-procedure (string->vector string &optional start end)
594594
(coerce-subseq string 'scheme-vector start end))
595595

596596
(define-scheme-procedure (vector-copy vector &optional start end)
597-
(check-type vector scheme-vector)
597+
(check-type vector vector?)
598598
(copy-seq-or-subseq vector start end))
599599

600600
(define-scheme-procedure (vector-copy! to at from &optional (start 0) end)
601-
(check-type to scheme-vector)
602-
(check-type from scheme-vector)
601+
(check-type to vector?)
602+
(check-type from vector?)
603603
(replace to from :start1 at :start2 start :end2 end))
604604

605605
(define-scheme-procedure (vector-append . vector)
606606
(apply #'concatenate 'simple-vector vector))
607607

608608
(define-scheme-procedure (vector-fill! vector fill &optional (start 0) end)
609-
(check-type vector scheme-vector)
609+
(check-type vector vector?)
610610
(fill vector fill :start start :end end))
611611

612612
;;;; 6.9 Bytevectors
613613

614614
(define-scheme-predicate (bytevector? obj)
615-
(typep obj 'bytevector))
615+
(bytevector? obj))
616616

617617
(define-scheme-procedure (make-bytevector k &optional (byte 0))
618618
(make-array k :element-type 'octet :initial-element byte))
@@ -621,31 +621,31 @@
621621
(make-array (length byte) :element-type 'octet :initial-contents byte))
622622

623623
(define-scheme-procedure (bytevector-length bytevector)
624-
(check-type bytevector bytevector)
624+
(check-type bytevector bytevector?)
625625
(length bytevector))
626626

627627
(define-scheme-procedure (bytevector-u8-ref bytevector k)
628-
(check-type bytevector bytevector)
628+
(check-type bytevector bytevector?)
629629
(aref bytevector k))
630630

631631
(define-scheme-procedure (bytevector-u8-set! bytevector k byte)
632-
(check-type bytevector bytevector)
632+
(check-type bytevector bytevector?)
633633
(setf (aref bytevector k) byte))
634634

635635
(define-scheme-procedure (bytevector-copy bytevector &optional start end)
636-
(check-type bytevector bytevector)
636+
(check-type bytevector bytevector?)
637637
(copy-seq-or-subseq bytevector start end))
638638

639639
(define-scheme-procedure (bytevector-copy! to at from &optional start end)
640-
(check-type to bytevector)
641-
(check-type from bytevector)
640+
(check-type to bytevector?)
641+
(check-type from bytevector?)
642642
(replace to from :start1 at :start2 start :end2 end))
643643

644644
(define-scheme-procedure (bytevector-append . bytevector)
645645
(apply #'concatenate 'bytevector bytevector))
646646

647647
(define-scheme-procedure (utf8->string bytevector &optional (start 0) end)
648-
(check-type bytevector bytevector)
648+
(check-type bytevector bytevector?)
649649
(utf8-to-string bytevector :start start :end end))
650650

651651
(define-scheme-procedure (string->utf8 string &optional (start 0) end)

0 commit comments

Comments
 (0)