emacs.d/clones/scheme/docs.racket-lang.org/reference/debugging.html

87 lines
98 KiB
HTML
Raw Normal View History

2022-09-30 11:00:09 +02:00
<!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&nbsp;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,&quot;tocview_0&quot;);">&#9658;</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&nbsp;</td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3&nbsp;</td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4&nbsp;</td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7&nbsp;</td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8&nbsp;</td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9&nbsp;</td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10&nbsp;</td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11&nbsp;</td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12&nbsp;</td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13&nbsp;</td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14&nbsp;</td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15&nbsp;</td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16&nbsp;</td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17&nbsp;</td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18&nbsp;</td><td><a href="running.html" class="tocviewself
&ldquo;stack trace&rdquo;) 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&amp;rel=using-errortrace.html&amp;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&amp;version=8.6" class="Sq" data-pltdoc="x">DrRacket</a>
programming environment provides much more debugging support.</p><h5 x-source-module="(lib &quot;scribblings/reference/reference.scrbl&quot;)" x-source-pkg="racket-doc" x-part-tag="&quot;Tracing&quot;">18.6.1<tt>&nbsp;</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">&nbsp;</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">&nbsp;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">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</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&rsquo;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&amp;rel=void_undefined.html&amp;version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#&lt;void&gt;</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">&gt; </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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</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">&nbsp;</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">&gt; </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">&nbsp;</span><span class="RktSym">f</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</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">&gt;(f 10)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; (f 9)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt;(f 8)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; (f 7)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt;(f 6)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; (f 5)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; &gt;(f 4)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; &gt; (f 3)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; &gt; &gt;(f 2)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; &gt; &gt; (f 1)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; &gt;[10] (f 0)</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; &lt;[10] 0</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; &lt; &lt; 1</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; &lt; &lt;2</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; &lt; 3</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; &lt;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">&gt; </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">&nbsp;</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">&nbsp;</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">&gt; </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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;</span><span class="RktVar">let</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktSym">v</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;</span><span class="RktVar">let</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">&gt; </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">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktVar">head</span><span class="hspace">&nbsp;</span><span class="RktVar">args</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</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">&gt; </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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">0</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</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">&nbsp;</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">&gt; </span><span class="RktPn">(</span><span class="RktSym">f</span><span class="hspace">&nbsp;</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">&gt;(f 5)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; (f 4)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt;(f 3)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; (f 2)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt;(f 1)</span></p></td></tr><tr><td><p><span class="RktOut">&gt; &gt; &gt; (f 0)</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt; 0</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; &lt;1</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt; 2</span></p></td></tr><tr><td><p><span class="RktOut">&lt; &lt;3</span></p></td></tr><tr><td><p><span class="RktOut">&lt; 4</span></p></td></tr><tr><td><p><span class="RktOut">&lt;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">&gt; </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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym">+n</span><span class="hspace">&nbsp;</span><span class="RktSym">n</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&gt; </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">&nbsp;</span><span class="RktSym">fact</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&gt; </span><span class="RktPn">(</span><span class="RktSym">fact</span><span class="hspace">&nbsp;</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">&gt;(fact #&lt;syntax:eval:15:0 (fact 5)&gt;)</span></p></td></tr><tr><td><p><span class="RktOut">&lt;#&lt;syntax:eval:15:0 120&gt;</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">&nbsp;</span><span class="RktPn">[</span><span class="RktPn">#:name</span><span class="hspace">&nbsp;</span><span class="RktVar">id</span><span class="RktPn">]</span><span class="hspace">&nbsp;</span><span class="RktVar">args</span><span class="hspace">&nbsp;</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">&gt; </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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">120</span><span class="RktPn">)</span><span class="hspace">&nbsp;</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">&gt;(eval:16:0 5)</span></p></td></tr><tr><td><p><span class="RktOut">&lt;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">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktVar">arg</span><span class="hspace">&nbsp;</span><span class="RktVar">expr</span><span class="RktPn">]</span><span class="hspace">&nbsp;</span><span class="RktMeta">...+</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVar">body</span><span class="hspace">&nbsp;</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">&gt; </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">&nbsp;</span><span class="RktSym">f</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktVal">5</span><span class="RktPn">]</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktVal">1</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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&amp;rel=void_undefined.html&amp;version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#&lt;void&gt;</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">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;</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">-&gt;</span></a></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktVar">proc</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">proc</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">&nbsp;</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">-&gt;</span></a></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</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&rsquo;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">&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span><span class="RktVar">proc</span><span class="hspace">&nbsp;</span><span class="RktPn">#:&lt;kw&gt;</span><span class="hspace">&nbsp;</span><span class="RktVar">kw-arg</span><span class="hspace">&nbsp;</span><span class="RktMeta">...</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">id</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">proc</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">kw-arg</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">&nbsp;</span></td><td valign="top">&rarr;</td><td valign="top"><span class="hspace">&nbsp;</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">-&gt;</span></a></span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktVar">trace-print-args</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">trace-print-args</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><t
traced call. It receives the name of the function, the function&rsquo;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&amp;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&amp;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-&gt;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">&gt; </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">&nbsp;</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">&nbsp;</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">&gt; </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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">ctpa</span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">s</span><span class="hspace">&nbsp;</span><span class="RktSym">l</span><span class="hspace">&nbsp;</span><span class="RktSym">kw</span><span class="hspace">&nbsp;</span><span class="RktSym">l2</span><span class="hspace">&nbsp;</span><span class="RktSym">n</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym">ctpa</span><span class="hspace">&nbsp;</span><span class="RktSym">s</span><span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktSym"><a href="stxops.html#%28def._%28%28quote._~23~25kernel%29._syntax-~3edatum%29%29" class="RktValLink" data-pltdoc="x">syntax-&gt;datum</a></span><span class="hspace">&nbsp;</span><span class="RktSym">l</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">kw</span><span class="hspace">&nbsp;</span><span class="RktSym">l2</span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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-&gt;datum</a></span> only when the argument or result is actually a syntax
object, for example, by defining <span class="RktSym">maybe-syntax-&gt;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">&gt; </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">&nbsp;</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">&nbsp;</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">&gt; </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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">maybe-syntax-&gt;datum</span><span class="hspace">&nbsp;</span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</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">&nbsp;</span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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-&gt;datum</a></span><span class="hspace">&nbsp;</span><span class="RktSym">syn?</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktSym">syn?</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</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">&nbsp;</span><span class="RktPn">(</span><span class="RktPn">[</span><span class="RktSym">ctpa</span><span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class=
traced call. It receives the name of the function, the function&rsquo;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">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktVar">prefix</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">prefix</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">"&gt;"</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">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;</span><span class="RktVar">prefix</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</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">&nbsp;&nbsp;</span><span class="RktVar">prefix</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</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">"&lt;"</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, &quot;8.6&quot;, &quot;../&quot;);"/></form>&nbsp;&nbsp;<a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot(&quot;8.6&quot;);">top</a><span class="tocsettoggle">&nbsp;&nbsp;<a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright">&nbsp;&nbsp;<a href="interactive.html" title="backward to &quot;18.5 Interactive Module Loading&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="running.html" title="up to &quot;18 Running Racket&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="compiler.html" title="forward to &quot;18.7 Controlling and Inspecting Compilation&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>