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,7 +269,8 @@ vicinity of DIRECTORY."
|
|||
(string-append directory "/" 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
|
||||
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
|
||||
|
@ -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
|
||||
'lstat'; exclude entries for which SELECT? does not return true.
|
||||
|
||||
This is the declarative counterpart of the 'interned-file' monadic procedure."
|
||||
(%local-file file
|
||||
This is the declarative counterpart of the 'interned-file' monadic procedure.
|
||||
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)))
|
||||
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)
|
||||
"Return the absolute file name for FILE, a <local-file> instance. A
|
||||
|
|
Reference in New Issue