guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/03: guix: records: Add match-record.


From: Ludovic Courtès
Subject: 01/03: guix: records: Add match-record.
Date: Sun, 5 Nov 2017 09:31:02 -0500 (EST)

civodul pushed a commit to branch master
in repository guix.

commit 6692d8454a89e542d85d2b6a93adfd373aeec39c
Author: nee <address@hidden>
Date:   Wed Oct 25 20:44:54 2017 +0200

    guix: records: Add match-record.
    
    * guix/records.scm: New syntax-rule.
    
    Signed-off-by: Ludovic Courtès <address@hidden>
---
 guix/records.scm | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/guix/records.scm b/guix/records.scm
index 7de5fcc..1f00e16 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]