diagnostics: Add syntax to capture arguments' syntax-properties.

* guix/diagnostics.scm (define-with-syntax-properties): Add it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Josselin Poiret 2021-11-17 14:43:47 +00:00 committed by Ludovic Courtès
parent fa67d6eef6
commit 346d2f6488
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5

View File

@ -54,7 +54,9 @@
condition-fix-hint
guix-warning-port
program-name))
program-name
define-with-syntax-properties))
;;; Commentary:
;;;
@ -331,3 +333,37 @@ number of arguments in ARGS matches the escapes in FORMAT."
(define program-name
;; Name of the command-line program currently executing, or #f.
(make-parameter #f))
(define-syntax define-with-syntax-properties
(lambda (x)
"Define BINDING to be a syntax form replacing each VALUE-IDENTIFIER and
SYNTAX-PROPERTIES-IDENTIFIER in body by the syntax and syntax-properties,
respectively, of each ensuing syntax object."
(syntax-case x ()
((_ (binding (value-identifier syntax-properties-identifier)
...)
body ...)
(and (and-map identifier? #'(value-identifier ...))
(and-map identifier? #'(syntax-properties-identifier ...)))
#'(define-syntax binding
(lambda (y)
(with-ellipsis :::
(syntax-case y ()
((_ value-identifier ...)
(with-syntax ((syntax-properties-identifier
#`'#,(datum->syntax y
(syntax-source
#'value-identifier)))
...)
#'(begin body ...)))
(_
(syntax-violation #f (format #f
"Expected (~a~{ ~a~})"
'binding
'(value-identifier ...))
y)))))))
(_
(syntax-violation #f "Expected a definition of the form \
(define-with-syntax-properties (binding (value syntax-properties) \
...) body ...)" x)))))