[plt-scheme] module constants and tracing

From: John Lawrence Aspden (news at aspden.com)
Date: Wed Sep 24 17:23:52 EDT 2008


Is there anyway to set (compile-enforce-module-constants #f) as the default
for DrScheme? I'd like to be able to trace function calls without having to
reload the program from scratch.

I'm playing with the meta-circular evaluator from SICP, and wishing to be
modern I've started the program with #lang scheme, and dealt with the
mutable pairs issues. The program is in a file "bookevaluator.ss"

I can run it by loading "bookevaluator.ss" into drscheme, and pressing the
run button. Then in my interactions window I can type:

> (me "hi")

(me calls the evaluator on an expression)

It works fine, but if I want to trace functions, and I type:
(require (lib "trace.ss"))
(trace self-evaluating?)

then I get the error:

set!: cannot modify a constant: self-evaluating?

I've found by trial and error that if I create a second
file "interactiveevaluator.ss" that contains:

(define (go) (eval '(begin
                      (require scheme/enter) 
                      (require (lib "trace.ss"))
                      (compile-enforce-module-constants #f)
                      (load "bookevaluator.ss")
                      (enter! "bookevaluator.ss"))))

and then load that into a *different* window, and press the run button, and
then type (go), then I end up with a REPL where tracing works, and I can

> (me ((λ(a b)(* a b)) 1 2))

> (trace apply-primitive-procedure)
> (me ((λ(a b)(* a b)) 1 2))
|(apply-primitive-procedure (primitive #<procedure:*>) (1 2))

But it would be nice to be able to do this in my original window. Nothing I
try will make this happen at all. Am I missing something simple to get this
to work? I'm using [3m].

Cheers, John.

Contractor in Cambridge UK -- http://www.aspden.com

Posted on the users mailing list.