guix: records: Add match-record.
* guix/records.scm: New syntax-rule. Signed-off-by: Ludovic Courtès <ludo@gnu.org>master
parent
50c229caf9
commit
6692d8454a
|
@ -26,7 +26,8 @@
|
|||
#:export (define-record-type*
|
||||
alist->record
|
||||
object->fields
|
||||
recutils->alist))
|
||||
recutils->alist
|
||||
match-record))
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
|
@ -375,4 +376,19 @@ pairs. Stop upon an empty line (after consuming it) or EOF."
|
|||
(else
|
||||
(error "unmatched line" line))))))))
|
||||
|
||||
(define-syntax match-record
|
||||
(syntax-rules ()
|
||||
"Bind each FIELD of a RECORD of the given TYPE to it's FIELD name.
|
||||
The current implementation does not support thunked and delayed fields."
|
||||
((_ record type (field fields ...) body ...)
|
||||
(if (eq? (struct-vtable record) type)
|
||||
;; TODO compute indices and report wrong-field-name errors at
|
||||
;; expansion time
|
||||
;; TODO support thunked and delayed fields
|
||||
(let ((field ((record-accessor type 'field) record)))
|
||||
(match-record record type (fields ...) body ...))
|
||||
(throw 'wrong-type-arg record)))
|
||||
((_ record type () body ...)
|
||||
(begin body ...))))
|
||||
|
||||
;;; records.scm ends here
|
||||
|
|
Reference in New Issue