Next: , Previous: Source Breakpoints, Up: Intro to Breakpoints


3.4.2.3 Procedural Breakpoints

A procedural breakpoint is a breakpoint that triggers whenever Guile is about to apply a specified procedure to its (already evaluated) arguments. To set a procedural breakpoint, call break! with the target procedure as a single argument. For example:

     (define (fact1 n)
       (if (= n 0)
           1
           (* n (fact1 (- n 1)))))
     
     (break! fact1)
     -|
     Set breakpoint 1: [fact1]
     =>
     #<<procedure-breakpoint> 808b0b0>

Alternatives to break! are trace! and trace-subtree!. The difference is that these three calls create a breakpoint in the same place but with three different behaviours, respectively debug-here, trace-here and trace-subtree. Breakpoint behaviours are documented fully later (see Breakpoint Behaviours), but to give a quick taste, here's an example of running code that includes a procedural breakpoint with the trace-here behaviour.

     (trace! fact1)
     -|
     Set breakpoint 1: [fact1]
     =>
     #<<procedure-breakpoint> 808b0b0>
     
     (fact1 4)
     -|
     |  [fact1 4]
     |  |  [fact1 3]
     |  |  |  [fact1 2]
     |  |  |  |  [fact1 1]
     |  |  |  |  |  [fact1 0]
     |  |  |  |  |  1
     |  |  |  |  2
     |  |  |  6
     |  |  24
     |  24
     =>
     24

To set and use procedural breakpoints, you will need to use the (ice-9 debugger breakpoints procedural) module:

     (use-modules (ice-9 debugger breakpoints procedural))

You may like to add this to your .guile file.