aboutsummaryrefslogtreecommitdiffstats
path: root/lib/SAHP/SAHP.internal-chicken.scm
blob: 992d98f64507e410ae5ad80e805fbbd81588677d (plain) (blame)
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
(define (%make-derived-SAHP desc)
  (let ((proc (lambda (arg1 . arg-rest)
                (call-SAHP desc (type-of arg1) (cons arg1 arg-rest)))))
    (extend-procedure proc desc)))

(define (make-new-SAHP)
  (%make-derived-SAHP
   (make-SAHP-descriptor (make-symbol-mapping)
                         (make-parameter (make-symbol-mapping))
                         (make-hash-table))))

(define (SAHP? x)
  (and (extended-procedure? x)
       (SAHP-descriptor? (extract-SAHP-descriptor x))))

(define extract-SAHP-descriptor procedure-data)

(define (type-of x)
  (cond
    ((exact-integer? x) 'exact-integer)
    ((integer? x) 'integer)
    ((rational? x) 'rational)
    ((real? x) 'real)
    ((complex? x) 'complex)
    ((number? x) 'number)
    ((boolean? x) 'boolean)
    ((char? x) 'char)
    ((null? x) 'null)
    ((pair? x) 'pair)
    ((procedure? x) 'procedure)
    ((symbol? x) 'symbol)
    ((bytevector? x) 'bytevector)
    ((eof-object? x) 'eof-object)
    ((port? x) 'port)
    ((string? x) 'string)
    ((vector? x) 'vector)
    ((record-instance? x) (record-instance-type x))
    (else (error "cannot derive type of" x))))

(define (subtypes type)
  (case type
    ((number) '(complex))
    ((complex) '(real))
    ((real) '(rational))
    ((rational) '(integer))
    ((integer) '(exact-integer))
    (else '())))