thin-provisioning-tools/functional-tests/srfi/s9/records.sls
Joe Thornber 3e5de399a7 [functional tests] Remove dependency on the ThunderChez library.
I've just moved the relevant code into the functional-tests dir.
2020-04-30 12:07:42 +01:00

52 lines
2.2 KiB
Scheme

;; Copyright (c) 2009 Derick Eddington. All rights reserved.
;; Licensed under an MIT-style license. My license is in the file
;; named LICENSE from the original collection this file is distributed
;; with. If this file is redistributed with some other collection, my
;; license must also be included.
#!r6rs
(library (srfi s9 records)
(export
(rename (srfi:define-record-type define-record-type)))
(import
(rnrs))
(define-syntax srfi:define-record-type
(lambda (stx)
(syntax-case stx ()
[(_ type (constructor constructor-tag ...)
predicate
(field-tag accessor setter ...) ...)
(and (for-all identifier?
#'(type constructor predicate constructor-tag ...
field-tag ... accessor ...))
(for-all (lambda (s)
(or (and (= 1 (length s)) (identifier? (car s)))
(= 0 (length s))))
#'((setter ...) ...))
(for-all (lambda (ct)
(memp (lambda (ft) (bound-identifier=? ct ft))
#'(field-tag ...)))
#'(constructor-tag ...)))
(with-syntax ([(field-clause ...)
(map (lambda (clause)
(if (= 2 (length clause))
#`(immutable . #,clause)
#`(mutable . #,clause)))
#'((field-tag accessor setter ...) ...))]
[(unspec-tag ...)
(remp (lambda (ft)
(memp (lambda (ct) (bound-identifier=? ft ct))
#'(constructor-tag ...)))
#'(field-tag ...))])
#'(define-record-type (type constructor predicate)
(sealed #t)
(protocol (lambda (ctor)
(lambda (constructor-tag ...)
(define unspec-tag)
...
(ctor field-tag ...))))
(fields field-clause ...)))])))
)