9 Check Syntax
Check Syntax is a part of the DrRacket collection, but is implemented via the
plugin API. See also drracket/check-syntax.
9.1 Check Syntax Button
syncheck-drracket-button | : | |
|
This is meant to be used with the
'drracket:toolbar-buttons
argument to the info proc returned
from
read-language.
This is defined with
define-local-member-name and
is bound to a method of no arguments of the DrRacket frame that runs Check
Syntax.
The bitmap in the Check Syntax button on the DrRacket frame.
9.2 Syntax Properties that Check Syntax Looks For
Check Syntax collects the values of the
syntax-propertys named
'disappeared-use,
'disappeared-binding,
'sub-range-binders, and
'mouse-over-tooltips and uses them to add
additional arrows to the program text. These properties are
intended for use when a macro discards or manufactures identifiers that,
from the programmers perspective, should be binding each other.
For example, here is program with a macro that discards its arguments, but
adds properties to the result syntax object so that the two occurrences of a
are treated as a binding/bound pair by Check Syntax.
Check Syntax draws arrows only between identifiers that are
free-identifier=?. They must be
syntax-original? or have the
syntax-property
'original-for-check-syntax set to
#t. See also
current-recorded-disappeared-uses.
Another approach for situations where identifiers are discarded by a
macro is to introduce a
let expression that doesn’t contribute
to the result of the computation, but does signal to Check Syntax that
there are some arrows to draw. For example, Check Syntax is unable to
draw the arrows between the introductions and uses of
a,
b,
and
c for this code:
Extending these macro to cooperate with Check syntax
requires more information to be collected on the definition
side and then used at the use side:
The value of the
'sub-range-binders property is expected
to be a tree of
cons pairs (in any configuration) whose leaves
are either ignored or are vectors of the shape
If the leaf is a vector, the first syntax object is expected to be an identifier whose
bound occurrences should have arrows that point to the syntax object in the sixth
position in the vector. The numbers indicate the starting point and the range inside
the corresponding identifier to consider as the location of the end of the arrow.
The property is looked for in expression positions and on binding identifiers.
Here’s an example:
After putting this code in the DrRacket window, mouse over the words “big” and
“generator” to see arrows pointing to the individual pieces of the identifier
big-generator. The four 0.5s in the first vector put the arrows
on big in the center of the identifiers; the 0.5 0 and the
0.5 1 in the second vector put the arrows at the top and bottom
center for generator.
Also, for backwards compatibility, if the vector has only six elements, those
elements must be everything except the (real-in 0 1) elements listed above and,
in that case, all four numbers are all taken to be 0.5.
The value of the
'mouse-over-tooltips property is expected to be
to be a tree of
cons pairs (in any configuration) whose leaves
are either ignored or are vectors of the shape
Each vector’s content indicates where to show a tooltip. The first three components are
a syntax object whose
syntax-source field indicates which file the tooltip goes in,
the start and end position in the editor where mouseovers will show the tooltip,
and the content of the tooltip. Note that editor positions count from zero, while syntax
object positions count from one, so use
sub1 to convert between them. If the
tooltip content is a procedure, this procedure is called by Check Syntax to compute the
string used for the tooltip, as Check Syntax traverses the syntax objects looking for
properties.
For example, here’s a macro that shows the span of itself in a tooltip on mouseover:
Changed in version 1.3 of package drracket: Looks for 'sub-range-binders
on binding identifiers (not just in expression positions).