DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(guile.info.gz) Trace

Info Catalog (guile.info.gz) Single-Step (guile.info.gz) Debugging Features (guile.info.gz) Backtrace
 
 11.2 Trace
 ==========
 
 When a function is "traced", it means that every call to that function
 is reported to the user during a program run.  This can help a
 programmer determine whether a function is being called at the wrong
 time or with the wrong set of arguments.
 
  -- Function: trace function
      Enable debug tracing on `function'.  While a program is being run,
      Guile will print a brief report at each call to a traced function,
      advising the user which function was called and the arguments that
      were passed to it.
 
  -- Function: untrace function
      Disable debug tracing for `function'.
 
    Example:
 
      (define (rev ls)
        (if (null? ls)
            '()
            (append (rev (cdr ls))
                    (cons (car ls) '())))) => rev
 
      (trace rev) => (rev)
 
      (rev '(a b c d e))
      => [rev (a b c d e)]
         |  [rev (b c d e)]
         |  |  [rev (c d e)]
         |  |  |  [rev (d e)]
         |  |  |  |  [rev (e)]
         |  |  |  |  |  [rev ()]
         |  |  |  |  |  ()
         |  |  |  |  (e)
         |  |  |  (e d)
         |  |  (e d c)
         |  (e d c b)
         (e d c b a)
         (e d c b a)
 
    Note the way Guile indents the output, illustrating the depth of
 execution at each function call.  This can be used to demonstrate, for
 example, that Guile implements self-tail-recursion properly:
 
      (define (rev ls sl)
        (if (null? ls)
            sl
            (rev (cdr ls)
                 (cons (car ls) sl)))) => rev
 
      (trace rev) => (rev)
 
      (rev '(a b c d e) '())
      => [rev (a b c d e) ()]
         [rev (b c d e) (a)]
         [rev (c d e) (b a)]
         [rev (d e) (c b a)]
         [rev (e) (d c b a)]
         [rev () (e d c b a)]
         (e d c b a)
         (e d c b a)
 
    Since the tail call is effectively optimized to a `goto' statement,
 there is no need for Guile to create a new stack frame for each
 iteration.  Using `trace' here helps us see why this is so.
 
Info Catalog (guile.info.gz) Single-Step (guile.info.gz) Debugging Features (guile.info.gz) Backtrace
automatically generated byinfo2html