Skip to content
Snippets Groups Projects
Commit faef3b6a authored by Ludovic Courtès's avatar Ludovic Courtès
Browse files

records: Factorize field property predicates.

* guix/records.scm (define-field-property-predicate): New macro.
  (define-record-type*)[thunked-field?, delayed-field?]: Use it.
parent b9c86473
No related branches found
No related tags found
No related merge requests found
...@@ -142,6 +142,17 @@ (define (field-value f) ...@@ -142,6 +142,17 @@ (define (field-value f)
'(expected ...) '(expected ...)
fields))))))))))))) fields)))))))))))))
(define-syntax-rule (define-field-property-predicate predicate property)
"Define PREDICATE as a procedure that takes a syntax object and, when passed
a field specification, returns the field name if it has the given PROPERTY."
(define (predicate s)
(syntax-case s (property)
((field (property values (... ...)) _ (... ...))
#'field)
((field _ properties (... ...))
(predicate #'(field properties (... ...))))
(_ #f))))
(define-syntax define-record-type* (define-syntax define-record-type*
(lambda (s) (lambda (s)
"Define the given record type such that an additional \"syntactic "Define the given record type such that an additional \"syntactic
...@@ -189,23 +200,8 @@ (define (field-default-value s) ...@@ -189,23 +200,8 @@ (define (field-default-value s)
(field-default-value #'(field options ...))) (field-default-value #'(field options ...)))
(_ #f))) (_ #f)))
(define (delayed-field? s) (define-field-property-predicate delayed-field? delayed)
;; Return the field name if the field defined by S is delayed. (define-field-property-predicate thunked-field? thunked)
(syntax-case s (delayed)
((field (delayed) _ ...)
#'field)
((field _ options ...)
(delayed-field? #'(field options ...)))
(_ #f)))
(define (thunked-field? s)
;; Return the field name if the field defined by S is thunked.
(syntax-case s (thunked)
((field (thunked) _ ...)
#'field)
((field _ options ...)
(thunked-field? #'(field options ...)))
(_ #f)))
(define (wrapped-field? s) (define (wrapped-field? s)
(or (thunked-field? s) (delayed-field? s))) (or (thunked-field? s) (delayed-field? s)))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment