Updated documentation for unstable/srcloc; added it for unstable/location.
svn: r18010
This commit is contained in:
parent
5069f3b37e
commit
86f0d92c26
|
@ -1,10 +1,27 @@
|
||||||
#lang scribble/manual
|
#lang scribble/manual
|
||||||
@(require scribble/eval "utils.ss" (for-label scheme/base unstable/srcloc))
|
@(require scribble/eval "utils.ss" (for-label scheme/base unstable/srcloc))
|
||||||
|
|
||||||
@(define evaluator (make-base-eval))
|
@(define unsyntax #f)
|
||||||
@(evaluator '(require unstable/srcloc))
|
|
||||||
|
|
||||||
@title[#:tag "srcloc"]{Source Locations}
|
@(define (new-evaluator)
|
||||||
|
(let* ([e (make-base-eval)])
|
||||||
|
(e '(require (for-syntax scheme/base)
|
||||||
|
unstable/srcloc
|
||||||
|
unstable/location))
|
||||||
|
e))
|
||||||
|
|
||||||
|
@(define evaluator (new-evaluator))
|
||||||
|
|
||||||
|
@(define reference-path
|
||||||
|
'(lib "scribblings/reference/reference.scrbl"))
|
||||||
|
|
||||||
|
@title{Source Locations}
|
||||||
|
|
||||||
|
There are two libraries in this collection for dealing with source locations;
|
||||||
|
one for manipulating representations of them, and the other for quoting the
|
||||||
|
location of a particular piece of source code.
|
||||||
|
|
||||||
|
@section[#:tag "srcloc"]{Representations}
|
||||||
|
|
||||||
@defmodule[unstable/srcloc]
|
@defmodule[unstable/srcloc]
|
||||||
|
|
||||||
|
@ -96,6 +113,62 @@ span sources. They also convert the result to the desired representation:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@defproc[(source-location-known? [loc source-location?]) boolean?]{
|
||||||
|
|
||||||
|
This predicate reports whether a given source location contains more information
|
||||||
|
than simply @scheme[#f].
|
||||||
|
|
||||||
|
@examples[#:eval evaluator
|
||||||
|
(source-location-known? #f)
|
||||||
|
(source-location-known? (make-srcloc #f #f #f #f #f))
|
||||||
|
(source-location-known? (make-srcloc 'source 1 2 3 4))
|
||||||
|
(source-location-known? (list #f #f #f #f #f))
|
||||||
|
(source-location-known? (vector 'source #f #f #f #f))
|
||||||
|
(source-location-known? (datum->syntax #f null #f))
|
||||||
|
(source-location-known? (datum->syntax #f null (list 'source #f #f #f #f)))
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@deftogether[(
|
||||||
|
@defproc[(source-location-source [loc source-location?]) any/c]
|
||||||
|
@defproc[(source-location-line [loc source-location?])
|
||||||
|
(or/c orexact-positive-integer? #f)]
|
||||||
|
@defproc[(source-location-column [loc source-location?])
|
||||||
|
(or/c exact-nonnegative-integer? #f)]
|
||||||
|
@defproc[(source-location-position [loc source-location?])
|
||||||
|
(or/c exact-positive-integer? #f)]
|
||||||
|
@defproc[(source-location-span [loc source-location?])
|
||||||
|
(or/c exact-nonnegative-integer? #f)]
|
||||||
|
)]{
|
||||||
|
|
||||||
|
These accessors extract the fields of a source location.
|
||||||
|
|
||||||
|
@examples[#:eval evaluator
|
||||||
|
(source-location-source #f)
|
||||||
|
(source-location-line (make-srcloc 'source 1 2 3 4))
|
||||||
|
(source-location-column (list 'source 1 2 3 4))
|
||||||
|
(source-location-position (vector 'source 1 2 3 4))
|
||||||
|
(source-location-span (datum->syntax #f null (list 'source 1 2 3 4)))
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defproc[(source-location-end [loc source-location?])
|
||||||
|
(or/c exact-nonnegative-integer? #f)]{
|
||||||
|
|
||||||
|
This accessor produces the end position of a source location (the sum of its
|
||||||
|
position and span, if both are numbers) or @scheme[#f].
|
||||||
|
|
||||||
|
@examples[#:eval evaluator
|
||||||
|
(source-location-end #f)
|
||||||
|
(source-location-end (make-srcloc 'source 1 2 3 4))
|
||||||
|
(source-location-end (list 'source 1 2 3 #f))
|
||||||
|
(source-location-end (vector 'source 1 2 #f 4))
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@deftogether[(
|
@deftogether[(
|
||||||
@defproc[(source-location->string [loc source-location?]) string?]{}
|
@defproc[(source-location->string [loc source-location?]) string?]{}
|
||||||
@defproc[(source-location->prefix [loc source-location?]) string?]{}
|
@defproc[(source-location->prefix [loc source-location?]) string?]{}
|
||||||
|
@ -121,3 +194,143 @@ The first produces a string describing the source location; the second appends
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@section[#:tag "location"]{Quoting}
|
||||||
|
|
||||||
|
@defmodule[unstable/location]
|
||||||
|
|
||||||
|
@unstable[@author+email["Carl Eastlund" "cce@ccs.neu.edu"]]
|
||||||
|
|
||||||
|
This module defines macros that evaluate to various aspects of their own source
|
||||||
|
location.
|
||||||
|
|
||||||
|
@emph{Note:} The examples below illustrate the use of these macros and the
|
||||||
|
representation of their output. However, due to the mechanism by which they are
|
||||||
|
generated, each example is considered a single character and thus does not have
|
||||||
|
realistic line, column, and character positions.
|
||||||
|
|
||||||
|
Furthermore, the examples illustrate the use of source location quoting inside
|
||||||
|
macros, and the difference between quoting the source location of the macro
|
||||||
|
definition itself and quoting the source location of the macro's arguments.
|
||||||
|
|
||||||
|
@defform*[[(quote-srcloc) (quote-srcloc expr)]]{
|
||||||
|
|
||||||
|
This form quotes the source location of @scheme[expr] as a @scheme[srcloc]
|
||||||
|
structure, using the location of the whole @scheme[(quote-srcloc)] expression if
|
||||||
|
no @scheme[expr] is given.
|
||||||
|
|
||||||
|
@defexamples[#:eval (new-evaluator)
|
||||||
|
(quote-srcloc)
|
||||||
|
(define-syntax (not-here stx) #'(quote-srcloc))
|
||||||
|
(not-here)
|
||||||
|
(not-here)
|
||||||
|
(define-syntax (here stx) #`(quote-srcloc #,stx))
|
||||||
|
(here)
|
||||||
|
(here)
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@deftogether[(
|
||||||
|
@defform*[[(quote-source-file) (quote-source-file expr)]]
|
||||||
|
@defform*[[(quote-line-number) (quote-line-number expr)]]
|
||||||
|
@defform*[[(quote-column-number) (quote-column-number expr)]]
|
||||||
|
@defform*[[(quote-character-position) (quote-character-position expr)]]
|
||||||
|
@defform*[[(quote-character-span) (quote-character-span expr)]]
|
||||||
|
)]{
|
||||||
|
|
||||||
|
These forms quote various fields of the source location of @scheme[expr], or of
|
||||||
|
the whole macro application if no @scheme[expr] is given.
|
||||||
|
|
||||||
|
@examples[#:eval (new-evaluator)
|
||||||
|
(list (quote-source-file)
|
||||||
|
(quote-line-number)
|
||||||
|
(quote-column-number)
|
||||||
|
(quote-character-position)
|
||||||
|
(quote-character-span))
|
||||||
|
(define-syntax (not-here stx)
|
||||||
|
#'(list (quote-source-file)
|
||||||
|
(quote-line-number)
|
||||||
|
(quote-column-number)
|
||||||
|
(quote-character-position)
|
||||||
|
(quote-character-span)))
|
||||||
|
(not-here)
|
||||||
|
(not-here)
|
||||||
|
(define-syntax (here stx)
|
||||||
|
#`(list (quote-source-file #,stx)
|
||||||
|
(quote-line-number #,stx)
|
||||||
|
(quote-column-number #,stx)
|
||||||
|
(quote-character-position #,stx)
|
||||||
|
(quote-character-span #,stx)))
|
||||||
|
(here)
|
||||||
|
(here)
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defform[(quote-module-path)]{
|
||||||
|
|
||||||
|
This form quotes a module path suitable for use with @scheme[require] which
|
||||||
|
refers to the module in which the macro application occurs. If executed at the
|
||||||
|
top level, it may return @scheme['top-level], or it may return a valid module
|
||||||
|
path if the current namespace was constructed by @scheme[module->namespace]
|
||||||
|
(such as at the DrScheme interactions window).
|
||||||
|
|
||||||
|
This macro operates by creating a @tech[#:doc reference-path]{variable
|
||||||
|
reference} (see @scheme[#%variable-reference]) at the point of its application.
|
||||||
|
It thus automatically describes its final expanded position, rather than the
|
||||||
|
module of any macro definition that happens to use it.
|
||||||
|
|
||||||
|
@defexamples[#:eval (new-evaluator)
|
||||||
|
(quote-module-path)
|
||||||
|
(module A scheme
|
||||||
|
(require unstable/location)
|
||||||
|
(define-syntax-rule (here) (quote-module-path))
|
||||||
|
(define a (here))
|
||||||
|
(provide a here))
|
||||||
|
(require 'A)
|
||||||
|
a
|
||||||
|
(module B scheme
|
||||||
|
(require unstable/location)
|
||||||
|
(require 'A)
|
||||||
|
(define b (here))
|
||||||
|
(provide b))
|
||||||
|
(require 'B)
|
||||||
|
b
|
||||||
|
[current-namespace (module->namespace (quote 'A))]
|
||||||
|
(quote-module-path)
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defform[(quote-module-name)]{
|
||||||
|
|
||||||
|
This form quotes the name (@tech[#:doc reference-path]{path} or @tech[#:doc
|
||||||
|
reference-path]{symbol}) of the module in which the macro application occurs, or
|
||||||
|
@scheme[#f] if it occurs at the top level. As with @scheme[quote-module-path],
|
||||||
|
@scheme[quote-module-name] uses a @tech[#:doc reference-path]{variable
|
||||||
|
reference}, so a top level namespace created by @scheme[module->namespace] will
|
||||||
|
be treated as a module, and the macro will always produce the module name of its
|
||||||
|
final expanded position.
|
||||||
|
|
||||||
|
@defexamples[#:eval (new-evaluator)
|
||||||
|
(quote-module-name)
|
||||||
|
(module A scheme
|
||||||
|
(require unstable/location)
|
||||||
|
(define-syntax-rule (here) (quote-module-name))
|
||||||
|
(define a (here))
|
||||||
|
(provide a here))
|
||||||
|
(require 'A)
|
||||||
|
a
|
||||||
|
(module B scheme
|
||||||
|
(require unstable/location)
|
||||||
|
(require 'A)
|
||||||
|
(define b (here))
|
||||||
|
(provide b))
|
||||||
|
(require 'B)
|
||||||
|
b
|
||||||
|
[current-namespace (module->namespace (quote 'A))]
|
||||||
|
(quote-module-name)
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user