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
parent
fb5dfa86b1
commit
302d46e63f
|
@ -269,8 +269,9 @@ 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
|
||||||
"Return an object representing local file FILE to add to the store; this
|
(lambda (s)
|
||||||
|
"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
|
||||||
the store under NAME--by default the base name of FILE.
|
the store under NAME--by default the base name of FILE.
|
||||||
|
@ -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
|
||||||
(delay (absolute-file-name file (current-source-directory)))
|
appears."
|
||||||
rest ...))
|
(syntax-case s ()
|
||||||
|
((_ file rest ...)
|
||||||
|
#'(%local-file file
|
||||||
|
(delay (absolute-file-name file (current-source-directory)))
|
||||||
|
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
|
||||||
|
|
Reference in New Issue