▼ |  | Unstable

1 | Guidelines for developing unstable libraries
2 | Bytes
3 | Contracts
4 | Exceptions
5 | Lists
6 | Net
7 | Path
8 | Source Locations
9 | Strings
10 | Structs
11 | Syntax
12 | Anaphoric Contracts
13 | Finding Mutated Variables
14 | Find
15 | Interface-Oriented Programming for Classes
16 | Sequences
17 | Hash Tables
18 | Match
19 | Skip Lists
20 | Interval Maps
21 | GUI libraries

On this page:

source-location?
source-location-list?
source-location-vector?
check-source-location!
build-source-location
build-source-location-list
build-source-location-vector
build-source-location-syntax
source-location->string
source-location->prefix

Version: 4.2.4
top← prev up next →

### 8`` Source Locations

Carl Eastlund <cce@ccs.neu.edu>

(require unstable/srcloc)

This library is unstable; compatibility will not be maintained. See Unstable for more information.

This module defines utilities for manipulating representations of source locations, including both srcloc structures and all the values accepted by datum->syntax’s third argument: syntax objects, lists, vectors, and #f.

(source-location? x) → boolean?
x : any/c

(source-location-list? x) → boolean?
x : any/c

(source-location-vector? x) → boolean?
x : any/c

These functions recognize valid source location representations. The first, source-location?, recognizes srcloc structures, syntax objects, lists, and vectors with appropriate structure, as well as #f. The latter predicates recognize only valid lists and vectors, respectively.

Examples:
> (source-location? #f)
#t
> (source-location? #'here)
#t
> (source-location? (make-srcloc 'here 1 0 1 0))
#t
> (source-location? (make-srcloc 'bad 1 #f 1 0))
#f
> (source-location? (list 'here 1 0 1 0))
#t
> (source-location? (list* 'bad 1 0 1 0 'tail))
#f
> (source-location? (vector 'here 1 0 1 0))
#t
> (source-location? (vector 'bad 0 0 0 0))
#f

(check-source-location! name x) → void?
name : symbol?
x : any/c

This procedure checks that its input is a valid source location. If it is, the procedure returns (void). If it is not, check-source-location! raises a detailed error message in terms of name and the problem with x.

Examples:
> (check-source-location! 'this-example #f)
> (check-source-location! 'this-example #'here)
> (check-source-location! 'this-example (make-srcloc 'here 1 0 1 0))
> (check-source-location! 'this-example (make-srcloc 'bad 1 #f 1 0))
this-example: expected a source location with line number
and column number both numeric or both #f; got 1 and #f
respectively: #(struct:srcloc bad 1 #f 1 0)
> (check-source-location! 'this-example (list 'here 1 0 1 0))
> (check-source-location! 'this-example (list* 'bad 1 0 1 0 'tail))
this-example: expected a source location (a list of 5
elements); got an improper list: (bad 1 0 1 0 . tail)
> (check-source-location! 'this-example (vector 'here 1 0 1 0))
> (check-source-location! 'this-example (vector 'bad 0 0 0 0))
this-example: expected a source location with a positive
line number or #f (second element); got line number 0:
#(bad 0 0 0 0)

(build-source-location loc ...) → srcloc?
loc : source-location?

(build-source-location-list loc ...) → source-location-list?
loc : source-location?

(build-source-location-vector loc ...) → source-location-vector?
loc : source-location?

(build-source-location-syntax loc ...) → syntax?
loc : source-location?

These procedures combine multiple (zero or more) source locations, merging locations within the same source and reporting #f for locations that span sources. They also convert the result to the desired representation: srcloc, list, vector, or syntax object, respectively.

Examples:
> (build-source-location)
#(struct:srcloc #f #f #f #f #f)
> (build-source-location-list)
(#f #f #f #f #f)
> (build-source-location-vector)
#(#f #f #f #f #f)
> (build-source-location-syntax)
#<syntax ()>
> (build-source-location #f)
#(struct:srcloc #f #f #f #f #f)
> (build-source-location-list #f)
(#f #f #f #f #f)
> (build-source-location-vector #f)
#(#f #f #f #f #f)
> (build-source-location-syntax #f)
#<syntax ()>
> (build-source-location (list 'here 1 2 3 4))
#(struct:srcloc here 1 2 3 4)
> (build-source-location-list (make-srcloc 'here 1 2 3 4))
(here 1 2 3 4)
> (build-source-location-vector (make-srcloc 'here 1 2 3 4))
#(here 1 2 3 4)
> (build-source-location-syntax (make-srcloc 'here 1 2 3 4))
#<syntax:1:2 ()>
> (build-source-location (list 'here 1 2 3 4) (vector 'here 5 6 7 8))
#(struct:srcloc here 1 2 3 12)
> (build-source-location-list (make-srcloc 'here 1 2 3 4) (vector 'here 5 6 7 8))
(here 1 2 3 12)
> (build-source-location-vector (make-srcloc 'here 1 2 3 4) (vector 'here 5 6 7 8))
#(here 1 2 3 12)
> (build-source-location-syntax (make-srcloc 'here 1 2 3 4) (vector 'here 5 6 7 8))
#<syntax:1:2 ()>
> (build-source-location (list 'here 1 2 3 4) (vector 'there 5 6 7 8))
#(struct:srcloc #f #f #f #f #f)
> (build-source-location-list (make-srcloc 'here 1 2 3 4) (vector 'there 5 6 7 8))
(#f #f #f #f #f)
> (build-source-location-vector (make-srcloc 'here 1 2 3 4) (vector 'there 5 6 7 8))
#(#f #f #f #f #f)
> (build-source-location-syntax (make-srcloc 'here 1 2 3 4) (vector 'there 5 6 7 8))
#<syntax ()>

(source-location->string loc) → string?
loc : source-location?

(source-location->prefix loc) → string?
loc : source-location?

These procedures convert source locations to strings for use in error messages. The first produces a string describing the source location; the second appends ": " to the string if it is non-empty.

Examples:
> (source-location->string (make-srcloc 'here 1 2 3 4))
"here:1.2"
> (source-location->string (make-srcloc 'here #f #f 3 4))
"here::3-7"
> (source-location->string (make-srcloc 'here #f #f #f #f))
"here"
> (source-location->string (make-srcloc #f 1 2 3 4))
":1.2"
> (source-location->string (make-srcloc #f #f #f 3 4))
"::3-7"
> (source-location->string (make-srcloc #f #f #f #f #f))
""
> (source-location->prefix (make-srcloc 'here 1 2 3 4))
"here:1.2: "
> (source-location->prefix (make-srcloc 'here #f #f 3 4))
"here::3-7: "
> (source-location->prefix (make-srcloc 'here #f #f #f #f))
"here: "
> (source-location->prefix (make-srcloc #f 1 2 3 4))
":1.2: "
> (source-location->prefix (make-srcloc #f #f #f 3 4))
"::3-7: "
> (source-location->prefix (make-srcloc #f #f #f #f #f))
""

top← prev up next →