feat: define-record-{equality,matcher}!
these are great
This commit is contained in:
parent
c910a214fb
commit
2222f55c42
2 changed files with 44 additions and 1 deletions
42
record.sls
Normal file
42
record.sls
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
(library (meh record)
|
||||||
|
(export define-record-equality! define-record-matcher!)
|
||||||
|
(import (chezscheme)
|
||||||
|
(meh match))
|
||||||
|
|
||||||
|
(define-syntax define-record-equality!
|
||||||
|
(syntax-rules ()
|
||||||
|
[(_ record-type-name)
|
||||||
|
(let ()
|
||||||
|
(define rtd (record-type-descriptor record-type-name))
|
||||||
|
(define field-count (vector-length (record-type-field-names rtd)))
|
||||||
|
(define accessors
|
||||||
|
(do ([i 0 (add1 i)]
|
||||||
|
[as '() (cons (record-accessor rtd i) as)])
|
||||||
|
[(= i field-count) (reverse! as)]))
|
||||||
|
(record-type-equal-procedure rtd
|
||||||
|
(lambda (r1 r2 =)
|
||||||
|
(for-all
|
||||||
|
(lambda (accessor) (= (accessor r1) (accessor r2)))
|
||||||
|
accessors))))]
|
||||||
|
[(_ name name* ...)
|
||||||
|
(begin (define-record-equality! name)
|
||||||
|
(define-record-equality! name*) ...)]))
|
||||||
|
|
||||||
|
(define-syntax define-record-matcher!
|
||||||
|
(syntax-rules ()
|
||||||
|
[(_ record-type-name)
|
||||||
|
(define-pattern record-type-name
|
||||||
|
(lambda (e)
|
||||||
|
(syntax-case e ()
|
||||||
|
[(_ pat* (... ...))
|
||||||
|
(with-syntax ([rtd #'(record-type-descriptor record-type-name)]
|
||||||
|
[(idx* (... ...))
|
||||||
|
(datum->syntax
|
||||||
|
#'* (iota (length (syntax->list #'(pat* (... ...))))))])
|
||||||
|
#'(and (guard x (record? x rtd))
|
||||||
|
(access (record-accessor rtd idx*) pat*)
|
||||||
|
(... ...)))])))]
|
||||||
|
[(_ name name* ...)
|
||||||
|
(begin (define-record-matcher! name)
|
||||||
|
(define-record-matcher! name*) ...)]))
|
||||||
|
)
|
3
std.sls
3
std.sls
|
@ -16,7 +16,8 @@
|
||||||
|
|
||||||
(import (chezscheme))
|
(import (chezscheme))
|
||||||
|
|
||||||
(export (import (meh match)))
|
(export (import (meh match))
|
||||||
|
(import (meh record)))
|
||||||
|
|
||||||
;;; SYNTAX
|
;;; SYNTAX
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue