Added a module for statically computing source locations and module paths.
svn: r17722
This commit is contained in:
parent
54d5b0ac7f
commit
f346bc7f1a
66
collects/unstable/location.ss
Normal file
66
collects/unstable/location.ss
Normal file
|
@ -0,0 +1,66 @@
|
|||
#lang scheme/base
|
||||
|
||||
(require (for-syntax scheme/base unstable/srcloc))
|
||||
|
||||
(provide quote-srcloc
|
||||
quote-source-file
|
||||
quote-line-number
|
||||
quote-column-number
|
||||
quote-character-position
|
||||
quote-character-span
|
||||
quote-module-path
|
||||
quote-module-name)
|
||||
|
||||
(define-syntax (quote-srcloc stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-srcloc #,stx)]
|
||||
[(_ loc)
|
||||
(with-syntax ([(arg ...) (build-source-location-list #'loc)])
|
||||
#'(make-srcloc (quote arg) ...))]))
|
||||
|
||||
(define-syntax (quote-source-file stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-source-file #,stx)]
|
||||
[(_ loc) #`(quote #,(source-location-source #'loc))]))
|
||||
|
||||
(define-syntax (quote-line-number stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-line-number #,stx)]
|
||||
[(_ loc) #`(quote #,(source-location-line #'loc))]))
|
||||
|
||||
(define-syntax (quote-column-number stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-column-number #,stx)]
|
||||
[(_ loc) #`(quote #,(source-location-column #'loc))]))
|
||||
|
||||
(define-syntax (quote-character-position stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-character-position #,stx)]
|
||||
[(_ loc) #`(quote #,(source-location-position #'loc))]))
|
||||
|
||||
(define-syntax (quote-character-span stx)
|
||||
(syntax-case stx ()
|
||||
[(_) #`(quote-character-span #,stx)]
|
||||
[(_ loc) #`(quote #,(source-location-span #'loc))]))
|
||||
|
||||
(define-syntax-rule (quote-module-name)
|
||||
(variable-reference->module-name (#%variable-reference)))
|
||||
|
||||
(define-syntax-rule (quote-module-path)
|
||||
(variable-reference->module-path (#%variable-reference)))
|
||||
|
||||
(define (variable-reference->module-path var)
|
||||
(module-name->module-path
|
||||
(variable-reference->module-name var)))
|
||||
|
||||
(define (variable-reference->module-name var)
|
||||
(let* ([rmp (variable-reference->resolved-module-path var)])
|
||||
(if (resolved-module-path? rmp)
|
||||
(resolved-module-path-name rmp)
|
||||
rmp)))
|
||||
|
||||
(define (module-name->module-path name)
|
||||
(cond
|
||||
[(path? name) `(file ,(path->string name))]
|
||||
[(symbol? name) `(quote ,name)]
|
||||
[else 'top-level]))
|
Loading…
Reference in New Issue
Block a user