aboutsummaryrefslogtreecommitdiffstats
path: root/srfi-259.sld
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-04-12 00:15:35 -0400
committerGravatar Peter McGoron 2025-04-12 00:15:35 -0400
commit0bc077807b6873b3606acabbe0b44629da2576ff (patch)
treec24a9c72b5352ea94a331ac1cf2a89e4a069f633 /srfi-259.sld
write
Diffstat (limited to 'srfi-259.sld')
-rw-r--r--srfi-259.sld65
1 files changed, 65 insertions, 0 deletions
diff --git a/srfi-259.sld b/srfi-259.sld
new file mode 100644
index 0000000..20a78be
--- /dev/null
+++ b/srfi-259.sld
@@ -0,0 +1,65 @@
+#| Copyright (C) 2025 Peter McGoron
+ |
+ | Permission is hereby granted, free of charge, to any person obtaining a
+ | copy of this software and associated documentation files (the
+ | "Software"), to deal in the Software without restriction, including
+ | without limitation the rights to use, copy, modify, merge, publish,
+ | distribute, sublicense, and/or sell copies of the Software, and to
+ | permit persons to whom the Software is furnished to do so, subject to
+ | the following conditions:
+ |
+ | The above copyright notice and this permission notice (including the
+ | next paragraph) shall be included in all copies or substantial portions
+ | of the Software.
+ |
+ | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ |#
+
+(define-library (srfi 259)
+ (import (scheme base) (scheme write)
+ integer-map
+ (chicken base)
+ (chicken foreign)
+ (chicken condition)
+ (chicken fixnum))
+ (export define-procedure-tag)
+ (include "lowlevel.scm")
+ (begin
+ (define-syntax define-procedure-tag
+ (syntax-rules ()
+ ((define-procedure-tag constructor predicate? accessor)
+ ;; Hygiene is broken here on CHICKEN, because `id` is not renamed
+ ;; here. It needs to be lexical, not global.
+ (begin
+ (define constructor #f)
+ (define predicate? #f)
+ (define accessor #f)
+ (let ((id (unique-id)))
+ (set! constructor
+ (lambda (tag proc)
+ (set-tagged-mapping proc id tag)))
+ (set! predicate?
+ (lambda (proc)
+ (cond
+ ((get-mapping proc) => (cut fxmapping-contains? <> id))
+ (else #f))))
+ (set! accessor
+ (lambda (proc)
+ (let ((map (get-mapping proc))
+ (raise-error (lambda ()
+ (raise
+ (make-property-condition
+ '(srfi-259 assertion-violation)
+ 'message
+ "procedure does not contain id"
+ 'arguments
+ (list proc id))))))
+ (if map
+ (fxmapping-ref map id raise-error)
+ (raise-error)))))))))))) \ No newline at end of file