~ruther/guix-local

6692d8454a89e542d85d2b6a93adfd373aeec39c — nee 8 years ago 50c229c
guix: records: Add match-record.

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

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
1 files changed, 17 insertions(+), 1 deletions(-)

M guix/records.scm
M guix/records.scm => guix/records.scm +17 -1
@@ 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