Right, sorry, I should have added… doing *that* (eliminating the traces for 
production code) is almost trivial: just make a macro that’s defined to 
disappear when a flag is set:

#lang racket

(define-for-syntax production-flag #f)

(define-syntax (debug-only stx)
  (syntax-case stx ()
    [(_ expr)
     (if production-flag
         #'(void)
         #'expr)]))


(define (fact f)
  (if (= f 0)
      1
      (begin
        (debug-only (printf "hello!\n"))
        (* f (fact (- f 1))))))

(fact 6)

The hard part is building UI tools to manipulate and insert these things 
without any changes to the code at all.

John


> On Mar 21, 2020, at 11:36 AM, Nicholas Papadonis 
> <[email protected]> wrote:
> 
> Thanks, you answered my question.  I’m educating myself in ways to debug 
> Scheme, coming from an imperative background.  
> 
> I suspect the solution would be to leave the trace statements in and use a 
> conditional when delivering production code.
> 
> 
>> On Mar 21, 2020, at 2:27 PM, John Clements <[email protected]> wrote:
>> 
>> It sounds like you’re looking for a way to have the trace inserted for you 
>> by a debugging tool, so you don’t have to remember to take it out again 
>> later. This wouldn’t be hard to do, but (as far as I know) no one’s taken 
>> the time to do it.
>> 
>> John
>> 
>>> On Mar 21, 2020, at 8:43 AM, Nicholas Papadonis 
>>> <[email protected]> wrote:
>>> 
>>> I was successful with MIT Scheme placing (trace proc) inside the closure of 
>>> this code.  Placing (trace proc) outside the closure did not have any 
>>> effect.
>>> 
>>> This is the question I'm asking.  Is it possible to trace without modifying 
>>> the closure?
>>> 
>>> I ask due to forward thinking about software engineering practices and 
>>> modifying code (although it could be argued in C a preprocessor block could 
>>> be placed to compile in or out conditional macros blocks).
>>> 
>>> Thanks again
>>> 
>>> On Sat, Mar 21, 2020 at 11:24 AM Ben Greenman <[email protected]> 
>>> wrote:
>>> On 3/21/20, dgtlcmo <[email protected]> wrote:
>>>> Does anyone know how to trace functions inside a closure?  I would like to
>>>> trace hanoi-move, however find that with MIT Scheme I need to place (trace)
>>>> 
>>>> within the closure (hanoi n), otherwise the trace will not occur.
>>>> 
>>>> Can a trace like this be performed in Racket?
>>>> 
>>>> Thanks
>>>> 
>>>> (define (hanoi n)
>>>> (define (pmd from to)
>>>>   (display "Move ")
>>>>   (display from)
>>>>   (display " to ")
>>>>   (display to)
>>>>   (newline)
>>>>   '())
>>>> (define (hanoi-move n from to spare)
>>>>   (cond ((= n 0) '())
>>>> ((= n 1) (pmd from to))
>>>> (else
>>>> (hanoi-move (- n 1) from spare to)
>>>> (hanoi-move 1 from to spare)
>>>> (hanoi-move (- n 1) spare to from))))
>>>> (hanoi-move n "A" "B" "C"))
>>> 
>>> Yes, Racket has trace tools:
>>> https://docs.racket-lang.org/reference/debugging.html
>>> 
>>> Try adding (trace hanoi) before the call to (hanoi-move ....) at the bottom
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Racket Users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/racket-users/CAKD0t1%2Bn_W7%3Dc7%3D_KAcFuJQrFo86JBx8uGJuBfXY%2BgZrDFKHWg%40mail.gmail.com.
>> 
>> 
>> 
> 



-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/fbf7ed4c-1373-495c-b951-575c3cf7e61f%40mtasv.net.

Reply via email to