Definitely good questions!
tap> + REBL to be a better version of the first two techniques: printing in-flight values and “spying”, because you can a) get the
tap> output separate from regular print output and b) process the
tap> programmatically and, with REBL, browse it as navigable data structures.
I haven’t found tracing libraries terrible useful so far (eight years of production Clojure) due to the signal to noise ratio but I can imagine them being very useful if you genuinely don’t understand the flow of control in a codebase well enough to pinpoint where to add some sort of print/spy function.
tap> + REBL gives me most of what “inline def” provides: tangible, browsable access to a local value – but I do have a hotkey in my editor to turn symbol/expression pairs in
let bindings into top-level
defs as well, for when I need to eval forms in a function that depend on other local symbols.
I have not, yet, found a need for a tool like scope-capture. ProtoREPL had something similar built-in and I used it maybe once in a year or so? I don’t have that in Chlorine (beyond the shortcut to turn
let bindings into
defs) and I haven’t missed it so far.
Something that REBL provides, that I’m finding very useful with
tap> (and I show it briefly in that screencast) is the
nav-> feature: I can add code that REBL applies as threaded navigation as I scroll through a series of
tap> results. That let’s you put code from your function into REBL and use the
tap> history to evaluate a specific form repeatedly for all of the calls. A bit like mapping
letsc across the captured history.