me
/
guix
Archived
1
0
Fork 0

gexp: Slightly improve error reporting for 'local-file'.

Reported by Ricardo Wurmus.

* guix/gexp.scm (local-file): Define using 'syntax-case' instead of
'syntax-rules'.  Explicitly handle the zero-argument case and the
use-as-an-identifier case.
master
Ludovic Courtès 2017-07-20 15:48:09 +02:00
parent fb5dfa86b1
commit 302d46e63f
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 20 additions and 6 deletions

View File

@ -269,7 +269,8 @@ vicinity of DIRECTORY."
(string-append directory "/" file)) (string-append directory "/" file))
(else file)))) (else file))))
(define-syntax-rule (local-file file rest ...) (define-syntax local-file
(lambda (s)
"Return an object representing local file FILE to add to the store; this "Return an object representing local file FILE to add to the store; this
object can be used in a gexp. If FILE is a relative file name, it is looked object can be used in a gexp. If FILE is a relative file name, it is looked
up relative to the source file where this form appears. FILE will be added to up relative to the source file where this form appears. FILE will be added to
@ -283,10 +284,23 @@ When RECURSIVE? is true, call (SELECT? FILE STAT) for each directory entry,
where FILE is the entry's absolute file name and STAT is the result of where FILE is the entry's absolute file name and STAT is the result of
'lstat'; exclude entries for which SELECT? does not return true. 'lstat'; exclude entries for which SELECT? does not return true.
This is the declarative counterpart of the 'interned-file' monadic procedure." This is the declarative counterpart of the 'interned-file' monadic procedure.
(%local-file file It is implemented as a macro to capture the current source directory where it
appears."
(syntax-case s ()
((_ file rest ...)
#'(%local-file file
(delay (absolute-file-name file (current-source-directory))) (delay (absolute-file-name file (current-source-directory)))
rest ...)) rest ...))
((_)
#'(syntax-error "missing file name"))
(id
(identifier? #'id)
;; XXX: We could return #'(lambda (file . rest) ...). However,
;; (syntax-source #'id) is #f so (current-source-directory) would not
;; work. Thus, simply forbid this form.
#'(syntax-error
"'local-file' is a macro and cannot be used like this")))))
(define (local-file-absolute-file-name file) (define (local-file-absolute-file-name file)
"Return the absolute file name for FILE, a <local-file> instance. A "Return the absolute file name for FILE, a <local-file> instance. A