guix: records: Add match-record.

* guix/records.scm: New syntax-rule.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
nee 2017-10-25 20:44:54 +02:00 committed by Ludovic Courtès
parent 50c229caf9
commit 6692d8454a
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -26,7 +26,8 @@ (define-module (guix records)
#:export (define-record-type*
alist->record
object->fields
recutils->alist))
recutils->alist
match-record))
;;; Commentary:
;;;
@ -375,4 +376,19 @@ (define (recutils->alist port)
(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