I tried to do : (define tests #f)(set! tests '()) but I still got the problem.
---------------------------------------- > From: [email protected] > Date: Sat, 10 Jul 2010 09:07:07 +0100 > Subject: Re: [racket] macro and set! problem > To: [email protected] > CC: [email protected] > > I think the issue is that any variable, V, in a module compiled > without a (set! V E) expression somewhere in it is compiled as > immutable. If the only set! in the module is in a macro that has not > been called yet, your variable is being compiled as immutable. If you > put a set! of the variable somewhere inside the module -- even just > (set! V V) as the last form in the module -- the variable should be > compiled as mutable and the macro should work in its original form. > > I have not tested this, so it may not be right, but it is what I > recall about how set! works with modules. > > Carl Eastlund > > On Sat, Jul 10, 2010 at 5:52 AM, Skeptic . wrote: >> >> >> Hi, >> I was trying to come up with a naive implementation of check-expect/test and >> I found out that if a macro expands to a set! on a module-level variable >> directly, an error will be given when using the macro from another module. A >> simple fix seems to instead have the macro to expands to a function call >> that performs the set!. >> I'm not sure what to think about it and I would like to hear why it works >> that way or what I have missed. >> Here's what I came up with in a few minutes : >> (provide check-expect test) >> (define tests '()) >> (define-syntax check-expect (λ (stx) (syntax-case stx () [(_ exp >> res) #'(add-test (list (delay exp) res #'stx))]))) >> (define add-test (λ (test) (set! tests (cons test tests)))) ; add-test is >> there because having check-expect expands to set! doesn't work when called >> from another module. >> (define test (λ () (printf "Ran ~a checks.\n" (length tests)) (let* >> ([failed (filter (λ (test) (not (equal? (force (car test)) (cadr test)))) >> (reverse tests))] [nbfailed (length failed)]) (if (> nbfailed >> 0) (begin (printf "~a tests failed:\n" nbfailed) >> (for-each (λ (ft) (let ([ft-stx (caddr ft)]) >> (printf "Actual value ~a differs from ~a, the expected >> value.\n ~a\n" (force (car ft)) (cadr ft) >> (format "In ~a at line ~a column ~a" (syntax-source ft-stx) (syntax-line >> ft-stx) (syntax-column ft-stx))))) failed)) (printf "All test >> passed!\n")) ))) _________________________________________________________________ Découvrez comment échanger avec vos vrais amis. http://go.microsoft.com/?linkid=9734398 _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

