aboutsummaryrefslogtreecommitdiffstats
path: root/lib/SAHP/SAHP.internal-chicken.scm
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-02-24 18:41:14 -0500
committerGravatar Peter McGoron 2025-02-24 18:41:53 -0500
commit4a71da136915aa50e45d39b868047686123d8a3e (patch)
treef8b99de05876b69ae06058380e98498e85490042 /lib/SAHP/SAHP.internal-chicken.scm
parentmake library hierarchy (diff)
make library hierarchy again
Diffstat (limited to 'lib/SAHP/SAHP.internal-chicken.scm')
-rw-r--r--lib/SAHP/SAHP.internal-chicken.scm47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/SAHP/SAHP.internal-chicken.scm b/lib/SAHP/SAHP.internal-chicken.scm
new file mode 100644
index 0000000..992d98f
--- /dev/null
+++ b/lib/SAHP/SAHP.internal-chicken.scm
@@ -0,0 +1,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 '())))