trace.ss: Tracing Top-level Procedure Calls
To load: (require (lib "trace.ss"))
This library mimics the tracing facility available in Chez SchemeTM.
Each variable
must be bound to a procedure in the environment of
the trace
expression. Each variable
is
set!
ed to a new procedure that traces procedure calls and
returns by printing the arguments and results of the call. If
multiple values are returned, each value is displayed starting on a
separate line.
When traced procedures invoke each other, nested invocations are shown by printing a nesting prefix. If the nesting depth grows to ten and beyond, a number is printed to show the actual nesting depth.
The trace
form can be used on a variable that is already
traced. In this case, assuming that the variable's value has not
been changed, trace
has no effect. If the variable has been
changed to a different procedure, then a new trace is installed.
Tracing respects tail calls to preserve loops, but its effect may be visible through continuation marks. When a call to a traced procedure occurs in tail position with respect to a previous traced call, then the tailness of the call is preserved (and the result of the call is not printed for the tail call, because the same result will be printed for an enclosing call). Otherwise, however, the body of a traced procedure is not evaluated in tail position with respect to a call to the procedure.
The value of a trace
expression is the list of names (as
symbols) specified for tracing.
Undoes the effects of the trace
form for each variable
,
set!
ing each variable
back to the untraced procedure,
but only if the current value of variable
is a traced
procedure. If the current value of a variable
is not a
procedure installed by trace
, then the variable is not
changed.
The value of an untrace
expression is the list of names (as
symbols) restored to their untraced definitions.