~ruther/guix-local

faef3b6a96114524c2a25e3b84caa042a2d2e598 — Ludovic Courtès 10 years ago b9c8647
records: Factorize field property predicates.

* guix/records.scm (define-field-property-predicate): New macro.
  (define-record-type*)[thunked-field?, delayed-field?]: Use it.
1 files changed, 13 insertions(+), 17 deletions(-)

M guix/records.scm
M guix/records.scm => guix/records.scm +13 -17
@@ 142,6 142,17 @@ fields, and DELAYED is the list of identifiers of delayed fields."
                                                      '(expected ...)
                                                      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*
  (lambda (s)
    "Define the given record type such that an additional \"syntactic


@@ 189,23 200,8 @@ field."
         (field-default-value #'(field options ...)))
        (_ #f)))

    (define (delayed-field? s)
      ;; Return the field name if the field defined by S is delayed.
      (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-field-property-predicate delayed-field? delayed)
    (define-field-property-predicate thunked-field? thunked)

    (define (wrapped-field? s)
      (or (thunked-field? s) (delayed-field? s)))