87 lines
98 KiB
HTML
87 lines
98 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>18.6 Debugging</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="extras.css" title="default"/><link rel="stylesheet" type="text/css" href="../racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../doc-site.css" title="default"/><script type="text/javascript" src="../scribble-common.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../doc-site.js"></script><script type="text/javascript" src="../local-redirect/local-redirect.js"></script><script type="text/javascript" src="../local-redirect/local-user-redirect.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="doc-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">►</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Reference</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2 </td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3 </td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4 </td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5 </td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6 </td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7 </td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8 </td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9 </td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10 </td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11 </td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12 </td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13 </td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18 </td><td><a href="running.html" class="tocviewself
|
||
|
“stack trace”) information that is printed with an exception. In
|
||
|
some cases, for <a href="implementations.html#%28tech._bc%29" class="techoutside" data-pltdoc="x"><span class="techinside">BC</span></a> implementation of Racket, disabling the
|
||
|
<a href="eval.html#%28tech._jit%29" class="techoutside" data-pltdoc="x"><span class="techinside">JIT</span></a> compiler can affect context information. For the <a href="implementations.html#%28tech._c%29" class="techoutside" data-pltdoc="x"><span class="techinside">CS</span></a>
|
||
|
implementation of Racket, setting the <a name="(idx._(gentag._563._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">PLT_CS_DEBUG</span> environment
|
||
|
variable causes compilation to record expression-level context
|
||
|
information, instead of just function-level information.</p><p>The <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=errortrace&rel=using-errortrace.html&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="RktSym">errortrace</span></a> library supports more consistent
|
||
|
(independent of the compiler) and precise context
|
||
|
information. The <a href="debugging.html#%28mod-path._racket%2Ftrace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/trace</span></a> library provides simple
|
||
|
tracing support. Finally, the <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?tag=%28part._%28.%27%28lib._scribblings%2Fdrracket%2Fdrracket..scrbl%29.%27._.%27top.%27%29%29&version=8.6" class="Sq" data-pltdoc="x">DrRacket</a>
|
||
|
programming environment provides much more debugging support.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""Tracing"">18.6.1<tt> </tt><a name="(part._.Tracing)"></a><a name="(mod-path._racket/trace)"></a>Tracing</h5><p><div class="SIntrapara"><table cellspacing="0" cellpadding="0" class="defmodule"><tr><td align="left"><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="stt"> </span><a href="debugging.html#%28mod-path._racket%2Ftrace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/trace</span></a><span class="RktPn">)</span></td><td align="right"><span class="RpackageSpec"><span class="Smaller"> package:</span> <a href="https://pkgs.racket-lang.org/package/base" title="Install this package using `raco pkg install base`"><span class="stt">base</span></a></span></td></tr></table></div><div class="SIntrapara">The bindings documented in this section are provided by the <a href="debugging.html#%28mod-path._racket%2Ftrace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/trace</span></a> library, not <a href="index.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/base</span></a> or <a href="index.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket</span></a>.</div></p><p>The <a href="debugging.html#%28mod-path._racket%2Ftrace%29" class="RktModLink" data-pltdoc="x"><span class="RktSym">racket/trace</span></a> library mimics the tracing facility
|
||
|
available in Chez Scheme.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/trace..rkt)._trace))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">trace</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Each <span class="RktVar">id</span> must be bound to a procedure in the environment of
|
||
|
the <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span> expression, and must not be imported from another module.
|
||
|
Each <span class="RktVar">id</span> is <span class="RktSym"><a href="set_.html#%28form._%28%28quote._~23~25kernel%29._set%21%29%29" class="RktStxLink" data-pltdoc="x">set!</a></span>ed to
|
||
|
a new procedure that traces procedure calls and returns by printing
|
||
|
the arguments and results of the call via
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-notify%29%29" class="RktValLink" data-pltdoc="x">current-trace-notify</a></span>. If multiple values are returned, each
|
||
|
value is displayed starting on a separate line.</div></p><p>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.</p><p>The <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span> form can be used on an identifier that is already
|
||
|
traced. In this case, assuming that the variable’s value has not been
|
||
|
changed, <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span> has no effect. If the variable has been
|
||
|
changed to a different procedure, then a new trace is installed.</p><p>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.</p><p>The result of a <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span> expression is <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=guide&rel=void_undefined.html&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#<void></span></span></a>.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._zero~3f%29%29" class="RktValLink" data-pltdoc="x">zero?</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">0</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._sub1%29%29" class="RktValLink" data-pltdoc="x">sub1</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span><span class="hspace"> </span><span class="RktSym">f</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktVal">10</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktOut">>(f 10)</span></p></td></tr><tr><td><p><span class="RktOut">> (f 9)</span></p></td></tr><tr><td><p><span class="RktOut">> >(f 8)</span></p></td></tr><tr><td><p><span class="RktOut">> > (f 7)</span></p></td></tr><tr><td><p><span class="RktOut">> > >(f 6)</span></p></td></tr><tr><td><p><span class="RktOut">> > > (f 5)</span></p></td></tr><tr><td><p><span class="RktOut">> > > >(f 4)</span></p></td></tr><tr><td><p><span class="RktOut">> > > > (f 3)</span></p></td></tr><tr><td><p><span class="RktOut">> > > > >(f 2)</span></p></td></tr><tr><td><p><span class="RktOut">> > > > > (f 1)</span></p></td></tr><tr><td><p><span class="RktOut">> > > >[10] (f 0)</span></p></td></tr><tr><td><p><span class="RktOut">< < < <[10] 0</span></p></td></tr><tr><td><p><span class="RktOut">< < < < < 1</span></p></td></tr><tr><td><p><span class="RktOut">< < < < <2</span></p></td></tr><tr><td><p><span class="RktOut">< < < < 3</span></p></td></tr><tr><td><p><span class="RktOut">< < < <4</span></p></td></tr><tr><td><p><span class="R
|
||
|
This is verbose to do directly with <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span>; refer to <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define-syntax%29%29" class="RktStxLink" data-pltdoc="x">trace-define-syntax</a></span> for a
|
||
|
simpler way to do this.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for-syntax%29%29" class="RktStxLink" data-pltdoc="x">for-syntax</a></span><span class="hspace"> </span><span class="RktSym">racket/trace</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin-for-syntax%29%29" class="RktStxLink" data-pltdoc="x">begin-for-syntax</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktVar">let</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._syntax-rules%29%29" class="RktStxLink" data-pltdoc="x">syntax-rules</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">x</span><span class="hspace"> </span><span class="RktSym">v</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">v</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span><span class="hspace"> </span><span class="RktVar">let</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define-syntax%29%29" class="RktStxLink" data-pltdoc="x">define-syntax</a></span><span class="hspace"> </span><span class="RktSym"><a href="let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace"> </span><span class="RktVar">let</span><span class="R
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span> to make the trace output more readable; see
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span> for an extended example.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/trace..rkt)._trace-define))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">trace-define</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">expr</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">trace-define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktVar">head</span><span class="hspace"> </span><span class="RktVar">args</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...+</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">The <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define%29%29" class="RktStxLink" data-pltdoc="x">trace-define</a></span> form is short-hand for first defining a
|
||
|
function then tracing it. This form supports all <span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span> forms.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define%29%29" class="RktStxLink" data-pltdoc="x">trace-define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._zero~3f%29%29" class="RktValLink" data-pltdoc="x">zero?</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">0</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._add1%29%29" class="RktValLink" data-pltdoc="x">add1</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._sub1%29%29" class="RktValLink" data-pltdoc="x">sub1</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktOut">>(f 5)</span></p></td></tr><tr><td><p><span class="RktOut">> (f 4)</span></p></td></tr><tr><td><p><span class="RktOut">> >(f 3)</span></p></td></tr><tr><td><p><span class="RktOut">> > (f 2)</span></p></td></tr><tr><td><p><span class="RktOut">> > >(f 1)</span></p></td></tr><tr><td><p><span class="RktOut">> > > (f 0)</span></p></td></tr><tr><td><p><span class="RktOut">< < < 0</span></p></td></tr><tr><td><p><span class="RktOut">< < <1</span></p></td></tr><tr><td><p><span class="RktOut">< < 2</span></p></td></tr><tr><td><p><span class="RktOut">< <3</span></p></td></tr><tr><td><p><span class="RktOut">< 4</span></p></td></tr><tr><td><p><span class="RktOut"><5</span></p></td></tr></table></td></tr><tr><td><p><span class="RktRes">5</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define%29%29" class="RktStxLink" data-pltdoc="x">trace-define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym">+n</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2B%29%29" class="RktValLink" data-pltdo
|
||
|
syntax transformer then tracing it. This form supports all <span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define-syntax%29%29" class="RktStxLink" data-pltdoc="x">define-syntax</a></span> forms.</div></p><p>For example:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-define-syntax%29%29" class="RktStxLink" data-pltdoc="x">trace-define-syntax</a></span><span class="hspace"> </span><span class="RktSym">fact</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._syntax-rules%29%29" class="RktStxLink" data-pltdoc="x">syntax-rules</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">(</span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29.__%29%29" class="RktStxLink" data-pltdoc="x">_</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">120</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym">fact</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktOut">>(fact #<syntax:eval:15:0 (fact 5)>)</span></p></td></tr><tr><td><p><span class="RktOut"><#<syntax:eval:15:0 120></span></p></td></tr></table></td></tr><tr><td><p><span class="RktRes">120</span></p></td></tr></table></blockquote></div></p><p>By default, <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span> prints out syntax objects when tracing a
|
||
|
syntax transformer. This can result in too much output if you do not need to see,
|
||
|
e.g., source information.
|
||
|
To get more readable output by printing syntax objects as datums, we can modify the
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span> and <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span>.
|
||
|
See <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span> for an example.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/trace..rkt)._trace-lambda))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-lambda%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">trace-lambda</a></span></span><span class="hspace"> </span><span class="RktPn">[</span><span class="RktPn">#:name</span><span class="hspace"> </span><span class="RktVar">id</span><span class="RktPn">]</span><span class="hspace"> </span><span class="RktVar">args</span><span class="hspace"> </span><span class="RktVar">expr</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">The <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-lambda%29%29" class="RktStxLink" data-pltdoc="x">trace-lambda</a></span> form enables tracing an anonymous function. This
|
||
|
form will attempt to infer a name using
|
||
|
<span class="RktSym">syntax-local-infer-name</span>, or a name can be specified using the
|
||
|
optional <span class="RktPn">#:name</span> argument. A syntax error is raised if a name
|
||
|
is not given and a name cannot be inferred.</div></p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-lambda%29%29" class="RktStxLink" data-pltdoc="x">trace-lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">120</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktOut">>(eval:16:0 5)</span></p></td></tr><tr><td><p><span class="RktOut"><120</span></p></td></tr></table></td></tr><tr><td><p><span class="RktRes">120</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/trace..rkt)._trace-let))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-let%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">trace-let</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktVar">expr</span><span class="RktPn">]</span><span class="hspace"> </span><span class="RktMeta">...+</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVar">body</span><span class="hspace"> </span><span class="RktMeta">...+</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">The <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-let%29%29" class="RktStxLink" data-pltdoc="x">trace-let</a></span> form enables tracing a named let.</div></p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace-let%29%29" class="RktStxLink" data-pltdoc="x">trace-let</a></span><span class="hspace"> </span><span class="RktSym">f</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">x</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._zero~3f%29%29" class="RktValLink" data-pltdoc="x">zero?</a></span><span class="hspace"> </span><span class="RktSym">x</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktVal">1</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span c
|
||
|
<span class="RktSym"><a href="set_.html#%28form._%28%28quote._~23~25kernel%29._set%21%29%29" class="RktStxLink" data-pltdoc="x">set!</a></span>ing each <span class="RktVar">id</span> back to the untraced procedure, but
|
||
|
only if the current value of <span class="RktVar">id</span> is a traced procedure. If
|
||
|
the current value of a <span class="RktVar">id</span> is not a procedure installed by
|
||
|
<span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span>, then the variable is not changed.</div></p><p>The result of an <span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._untrace%29%29" class="RktStxLink" data-pltdoc="x">untrace</a></span> expression is <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=guide&rel=void_undefined.html&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#<void></span></span></a>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/trace..rkt)._current-trace-notify))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-notify%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-trace-notify</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-notify%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-trace-notify</a></span></span><span class="hspace"> </span><span class="RktVar">proc</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">A <a href="eval-model.html#%28tech._parameter%29" class="techoutside" data-pltdoc="x"><span class="techinside">parameter</span></a> that determines the way that trace output is
|
||
|
displayed. The string given to <span class="RktVar">proc</span> is a trace; it does not
|
||
|
end with a newline, but it may contain internal newlines. Each call or
|
||
|
result is converted into a string using <span class="RktSym"><a href="pretty-print.html#%28def._%28%28lib._racket%2Fpretty..rkt%29._pretty-print%29%29" class="RktValLink" data-pltdoc="x">pretty-print</a></span>. The
|
||
|
parameter’s default value prints the given string followed by a newline to
|
||
|
<span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._current-output-port%29%29" class="RktValLink" data-pltdoc="x">current-output-port</a></span><span class="RktPn">)</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/trace..rkt)._trace-call))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._trace-call%29%29" class="RktValDef RktValLink" data-pltdoc="x">trace-call</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span><span class="RktPn">#:<kw></span><span class="hspace"> </span><span class="RktVar">kw-arg</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">kw-arg</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Calls <span class="RktVar">proc</span> with the arguments supplied in
|
||
|
<span class="RktVar">args</span>, and possibly using keyword arguments. Also prints out the
|
||
|
trace information during the call, as described above in the docs for
|
||
|
<span class="RktSym"><a href="debugging.html#%28form._%28%28lib._racket%2Ftrace..rkt%29._trace%29%29" class="RktStxLink" data-pltdoc="x">trace</a></span>, using <span class="RktVar">id</span> as the name of <span class="RktVar">proc</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/trace..rkt)._current-trace-print-args))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-trace-print-args</a></span></span><span class="RktPn"></span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="symbols.html#%28def._%28%28quote._~23~25kernel%29._symbol~3f%29%29" class="RktValLink" data-pltdoc="x">symbol?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._list~3f%29%29" class="RktValLink" data-pltdoc="x">list?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._listof%29%29" class="RktValLink" data-pltdoc="x">listof</a></span><span class="hspace"> </span><span class="RktSym"><a href="keywords.html#%28def._%28%28quote._~23~25kernel%29._keyword~3f%29%29" class="RktValLink" data-pltdoc="x">keyword?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="pairs.html#%28def._%28%28quote._~23~25kernel%29._list~3f%29%29" class="RktValLink" data-pltdoc="x">list?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._number~3f%29%29" class="RktValLink" data-pltdoc="x">number?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-trace-print-args</a></span></span><span class="hspace"> </span><span class="RktVar">trace-print-args</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">trace-print-args</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">:</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><t
|
||
|
traced call. It receives the name of the function, the function’s
|
||
|
ordinary arguments, its keywords, the values of the keywords, and a
|
||
|
number indicating the depth of the call.</div></p><p>Modifying this and <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span> is useful to to get more
|
||
|
readable or additional output when tracing syntax transformers.
|
||
|
For example, we can use <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?tag=%28mod-path._.%27debug-scopes.%27%29&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="RktSym">debug-scopes</span></a> to add scopes information
|
||
|
to the trace, (see <a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?tag=%28mod-path._.%27debug-scopes.%27%29&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="RktSym">debug-scopes</span></a> for an example),
|
||
|
or remove source location information to just display the shape of the syntax
|
||
|
object</p><p>In this example, we update the printers <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span> and
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span>
|
||
|
by storing the current printers (<span class="RktSym">ctpa</span> and
|
||
|
<span class="RktSym">ctpr</span>) to cast syntax objects to datum using <span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax-~3edatum%29%29" class="RktValLink" data-pltdoc="x">syntax->datum</a></span> and then
|
||
|
pass the transformed arguments and results to the previous printer.
|
||
|
When tracing, syntax arguments will be displayed without source location
|
||
|
information, shortening the output.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for-syntax%29%29" class="RktStxLink" data-pltdoc="x">for-syntax</a></span><span class="hspace"> </span><span class="RktSym">racket/trace</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin-for-syntax%29%29" class="RktStxLink" data-pltdoc="x">begin-for-syntax</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">ctpa</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">s</span><span class="hspace"> </span><span class="RktSym">l</span><span class="hspace"> </span><span class="RktSym">kw</span><span class="hspace"> </span><span class="RktSym">l2</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">ctpa</span><span class="hspace"> </span><span class="RktSym">s</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="pairs.html#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29" class="RktValLink" data-pltdoc="x">map</a></span><span class="hspace"> </span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax-~3edatum%29%29" class="RktValLink" data-pltdoc="x">syntax->datum</a></span><span class="hspace"> </span><span class="RktSym">l</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">kw</span><span class="hspace"> </span><span class="RktSym">l2</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28def._%28%28lib.
|
||
|
transformation makes assumptions about or changes the type of the
|
||
|
argument/result of the traced identifier.
|
||
|
This modification of <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span> and
|
||
|
<span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span> is an imperative update, and will affect all traced identifiers.
|
||
|
This example assumes all arguments and results to <span class="emph">all traced functions</span> will be syntax objects,
|
||
|
which is the case only if you are only tracing syntax transformers.
|
||
|
If used as-is, the above code could result in type errors when tracing both functions and syntax transformers.
|
||
|
It would be better to use <span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax-~3edatum%29%29" class="RktValLink" data-pltdoc="x">syntax->datum</a></span> only when the argument or result is actually a syntax
|
||
|
object, for example, by defining <span class="RktSym">maybe-syntax->datum</span> as follows.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for-syntax%29%29" class="RktStxLink" data-pltdoc="x">for-syntax</a></span><span class="hspace"> </span><span class="RktSym">racket/trace</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin-for-syntax%29%29" class="RktStxLink" data-pltdoc="x">begin-for-syntax</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">maybe-syntax->datum</span><span class="hspace"> </span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29" class="RktStxLink" data-pltdoc="x">if</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax~3f%29%29" class="RktValLink" data-pltdoc="x">syntax?</a></span><span class="hspace"> </span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax-~3edatum%29%29" class="RktValLink" data-pltdoc="x">syntax->datum</a></span><span class="hspace"> </span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktSym">syn?</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">ctpa</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class=
|
||
|
traced call. It receives the name of the function, the function’s
|
||
|
results, and a number indicating the depth of the call.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/trace..rkt)._current-prefix-in))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-prefix-in%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-prefix-in</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-prefix-in%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-prefix-in</a></span></span><span class="hspace"> </span><span class="RktVar">prefix</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prefix</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This string is used by the default value of <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-args%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-args</a></span>
|
||
|
indicating that the current line is showing the a call to a
|
||
|
traced function.</div></p><p>It defaults to <span class="RktVal">">"</span>.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>parameter</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/trace..rkt)._current-prefix-out))"></a><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-prefix-out%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-prefix-out</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span title="Provided from: racket/trace | Package: base"><span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-prefix-out%29%29" class="RktValDef RktValLink" data-pltdoc="x">current-prefix-out</a></span></span><span class="hspace"> </span><span class="RktVar">prefix</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">prefix</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">This string is used by the default value of <span class="RktSym"><a href="debugging.html#%28def._%28%28lib._racket%2Ftrace..rkt%29._current-trace-print-results%29%29" class="RktValLink" data-pltdoc="x">current-trace-print-results</a></span>
|
||
|
indicating that the current line is showing the result
|
||
|
of a traced call.</div></p><p>It defaults to <span class="RktVal">"<"</span>.</p><div class="navsetbottom"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, "8.6", "../");"/></form> <a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot("8.6");">top</a><span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="interactive.html" title="backward to "18.5 Interactive Module Loading"" data-pltdoc="x">← prev</a> <a href="running.html" title="up to "18 Running Racket"" data-pltdoc="x">up</a> <a href="compiler.html" title="forward to "18.7 Controlling and Inspecting Compilation"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html>
|