.
original commit: 0f289e6be219405304897fa8a2e8f57b51a9a481
This commit is contained in:
parent
06f9d4d900
commit
d3e4d22472
|
@ -2,24 +2,27 @@
|
|||
(module include mzscheme
|
||||
(require-for-syntax (lib "stx.ss" "syntax"))
|
||||
|
||||
(define-syntax include
|
||||
(define-syntax include-at/relative-to
|
||||
(lambda (stx)
|
||||
;; Parse the file name
|
||||
(let ([file
|
||||
(syntax-case* stx (build-path) module-or-top-identifier=?
|
||||
[(_ fn)
|
||||
(string? (syntax-e (syntax fn)))
|
||||
(syntax-e (syntax fn))]
|
||||
[(_ (build-path elem1 elem ...))
|
||||
(andmap
|
||||
(lambda (e)
|
||||
(or (string? (syntax-e e))
|
||||
(and (identifier? e)
|
||||
(or
|
||||
(module-identifier=? e (quote-syntax up))
|
||||
(module-identifier=? e (quote-syntax same))))))
|
||||
(syntax->list (syntax (elem1 elem ...))))
|
||||
(apply build-path (syntax-object->datum (syntax (elem1 elem ...))))])])
|
||||
(let-values ([(ctx loc file)
|
||||
(syntax-case* stx (build-path) module-or-top-identifier=?
|
||||
[(_ ctx loc fn)
|
||||
(string? (syntax-e (syntax fn)))
|
||||
(values (syntax ctx) (syntax loc) (syntax-e (syntax fn)))]
|
||||
[(_ ctx loc (build-path elem1 elem ...))
|
||||
(andmap
|
||||
(lambda (e)
|
||||
(or (string? (syntax-e e))
|
||||
(and (identifier? e)
|
||||
(or
|
||||
(module-identifier=? e (quote-syntax up))
|
||||
(module-identifier=? e (quote-syntax same))))))
|
||||
(syntax->list (syntax (elem1 elem ...))))
|
||||
(values
|
||||
(syntax ctx)
|
||||
(syntax loc)
|
||||
(apply build-path (syntax-object->datum (syntax (elem1 elem ...)))))])])
|
||||
;; Complete the file name
|
||||
(let ([c-file
|
||||
(if (complete-path? file)
|
||||
|
@ -28,12 +31,12 @@
|
|||
file
|
||||
(cond
|
||||
;; Src of include expression is a path?
|
||||
[(and (string? (syntax-source stx))
|
||||
(complete-path? (syntax-source stx)))
|
||||
[(and (string? (syntax-source loc))
|
||||
(complete-path? (syntax-source loc)))
|
||||
(let-values ([(base name dir?)
|
||||
(split-path (syntax-source stx))])
|
||||
(split-path (syntax-source loc))])
|
||||
(if dir?
|
||||
(syntax-source stx)
|
||||
(syntax-source loc)
|
||||
base))]
|
||||
;; Load relative?
|
||||
[(current-load-relative-directory)]
|
||||
|
@ -86,7 +89,7 @@
|
|||
[else
|
||||
(let ([v (syntax-e content)])
|
||||
(datum->syntax-object
|
||||
stx
|
||||
ctx
|
||||
(cond
|
||||
[(pair? v)
|
||||
(loop v)]
|
||||
|
@ -102,7 +105,32 @@
|
|||
`(begin ,@lexed-content)
|
||||
stx))))))))
|
||||
|
||||
(provide include))
|
||||
(define-syntax include
|
||||
(lambda (stx)
|
||||
(syntax-case stx ()
|
||||
[(_ fn)
|
||||
;; Check form of fn:
|
||||
(syntax-case* (syntax fn) (build-path) module-or-top-identifier=?
|
||||
[fn
|
||||
(string? (syntax-e (syntax fn)))
|
||||
'ok]
|
||||
[(build-path elem1 elem ...)
|
||||
(andmap
|
||||
(lambda (e)
|
||||
(or (string? (syntax-e e))
|
||||
(and (identifier? e)
|
||||
(or
|
||||
(module-identifier=? e (quote-syntax up))
|
||||
(module-identifier=? e (quote-syntax same))))))
|
||||
(syntax->list (syntax (elem1 elem ...))))
|
||||
'ok]
|
||||
[_else (raise-syntax-error #f "bad syntax" stx (syntax fn))])
|
||||
;; Expand to include-at/relative-to:
|
||||
(with-syntax ([_stx stx])
|
||||
(syntax/loc stx (include-at/relative-to _stx _stx fn)))])))
|
||||
|
||||
(provide include
|
||||
include-at/relative-to))
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user