[racket] trace: set!: cannot mutate module-required identifier - alright .. how do you do this?

From: J. Ian Johnson (ianj at ccs.neu.edu)
Date: Mon Jan 19 09:06:53 EST 2015

Yes, racket 101 (305?) is that identifiers can only be set!'d in their defining module. This is to allow necessary optimizations such as inlining.

If you want to trace `f` from a different module. you can `(define (g . args) (apply f args)) (trace g)`, use `g` wherever you use `f`. You won't get any calls the library makes internally, but if you're just tracing for your own code, you'll be golden.

-Ian

----- Original Message -----
From: "Thomas Lynch" <thomas.lynch at reasoningtechnology.com>
To: "users" <users at racket-lang.org>
Sent: Monday, January 19, 2015 8:59:55 AM
Subject: [racket] trace: set!: cannot mutate module-required identifier - alright .. how do you do this?

Saw this in another thread here, but the proposed solution didnt work, well at least the way I understood it. So .. 

In file db-lib.rkt I have a definition: 




(provide db-exec) 
(define (db-exec a) ...) 

Then in racket 




> (enter! "db-user.rkt") 

Where db-citation.rkt has 




(require "db-lib.rkt") 

Now at the read-eval-print prompt I try 




(enter! "db-citation.rkt") 

And when I do (trace db-exec) I get the cannot mutate error. (Surely this must be a racket 101 type problem.) So I try to include the module at the current scope.. 




racket at db-citation.rkt> (require "db-lib.rkt") 
racket at db-citation.rkt> (require racket/trace) 
racket at db-citation.rkt> (trace db-exec) 

racket at db-citation.rkt> stdin::1130: set!: cannot mutate module-required identifier in: db-exec 
ok, so that doesn't work, so I start over again. This time after reading the thread on this list 




From: Vincent St-Amour (stamourv at ccs.neu.edu ) 
Date: Mon Oct 10 13:49:46 EDT 2011 

which concludes by saying 'put the trace in your program that should work', so I add this to "db-citation.rkt" 




(require racket/trace) 
(trace db-exec) 

And then at the prompt I get the following: 




Welcome to Racket v5.2.1. 
racket@> (enter! "db-citation.rkt") 
db-citation.rkt:26:11: set!: cannot mutate module-required identifier in: db-exec 

Alright, so what is the magic incantation here that allows one to debug/trace calls in included modules? 

Thanks! 

Thomas 

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Posted on the users mailing list.