The top-level code in the module runs only once. Here's a small version of your code and the results of running it.
☕ cat A.rkt #lang racket (require "utility.rkt") (printf "A\n") ☕ [robby@gongguan] ~/x ☕ cat B.rkt #lang racket (require "utility.rkt") (printf "B\n") ☕ [robby@gongguan] ~/x ☕ cat C.rkt #lang racket (require "A.rkt") (require "B.rkt") (printf "C\n") ☕ [robby@gongguan] ~/x ☕ cat utility.rkt #lang racket (printf "utility\n") ☕ [robby@gongguan] ~/x ☕ racket Welcome to Racket v6.2.900.17. -> (enter! "C.rkt") utility A B C "C.rkt"> On Wed, Sep 23, 2015 at 3:46 AM, Thomas Lynch <[email protected]> wrote: > > There is a module that is utilitarian in nature, that is included in another > other modules. These other modules are in turn included in yet other > modules. > > module A: > > #lang racket > (require "utility.rkt") > > > module B: > > #lang racket > (require "utility.rkt") > > > module C: > > #lang racket > (require "A.rkt") > (require "B.rkt") > > > 'utility' has some initialization code and a module variable that is > intended to be shared by the utility code. Say for the sake of example, > utility maintains a collection of test functions: > > (define test-routines '()) > (define (test-name a-test) (symbol->string (object-name a-test))) > > (define (test-hook a-test) > (display "hooking test: ") (displayln (test-name a-test)) > (set! test-routines (cons a-test (remove a-test test-routines (λ(e f) > (string=? (test-name e) (test-name f))))))) > > > (define (test-all) > (let*( > [results (map test (reverse test-routines))] > [no-tests (length results)] > [result-flags (map cadr results)] > [error-count (count (λ(e) (not e)) result-flags)] > [all-passed (andmap (λ(e) e) result-flags)] > ) > ;;(displayln results) > (cond > [all-passed (display "all ")(display no-tests) (displayln " > passed")] > [else > (display "failed: ") > (display error-count) > (display " of ") > (displayln no-tests) > ] > ) > all-passed > )) > > > So what is happening here is that the module code initializes a global test > list. Other modules which require utilities.rkt then call test-hook to > hook in their test code. Then after all the modules are loaded, the > application calls (test-all) to see that everything is running well. > > However, it isn't working because the "utility.rkt" module initialization > code is running multiple times, and each time clobbering (making new > version?) of the test list. This behavior did not occur when the require > call depth was only one deep, but now that it is two deep, it is happening. > > racket@> (enter! "object.rkt") > hooking test: example-pass-test > > ... > (test-all) to run the tests > hooking test: and-form-test-0 > hooking test: test-Λ-0 > ... > > ===> RUNNING INIT CODE IN MODULE A SECOND TIME: > > hooking test: example-pass-test > ... > hooking test: test-flatten-1 > hooking test: test-replace-0 > > .... > ===> RUNNING INIT CODE IN MODULE A THIRD TIME: > > hooking test: example-pass-test > hooking test: example-fail-test > .... > > > Should it be like this? Is a module static (one copy) or is it like a > class (new copy on invocation) actually I'm seeing a third behavior, static > at one level deep, new instances at two levels deep (or just running the > code again over the same instance?) > > > > > -- > You received this message because you are subscribed to the Google Groups > "Racket Developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-dev/421e6cbe-e3f4-4164-8cff-db74187bd986%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-dev/CAL3TdON%2B439pCUW%2BuTJJO547vNU9WAG0oaJMkTeFc9mWom1SCA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
