Hello, interesting. Is this a bug?? Somehow the println seems to do strange things here.
If I evaluate in namespace user (do (ns ns-1) (def my-namespace *ns*) my-namespace) The REPL switches to the namespace ns-1 and the var my-namespace is in ns-1 If I evaluate in namespace user (println (do (ns ns-1) (def my-namespace *ns*) my-namespace)) The REPL switches to the namespace ns-1 and the var my-namespace is in user ! That seems to be the background of Davids irritation. Any explanations? Kind regards, alux On 28 Apr., 17:37, Nate Young <youn...@gmail.com> wrote: > On Apr 26, 5:25 pm, David McNeil <mcneil.da...@gmail.com> wrote:> I am > experimenting with clojure.test and I encountered the following > > situation which I cannot explain. > > > This code: > > > (println (do > > (ns ns01 > > (:use clojure.test)) > > (deftest test1 nil) > > (run-tests))) > > > Produces the expected result (note: it runs one test): > > This is actually NOT what I'm seeing. At least when I run it, it > appears to run exactly zero tests. > > > [snip] > > > (println (let [] > > (do > > (ns ns02 > > (:use clojure.test)) > > (deftest test1 nil) > > (run-tests)))) > > > Then I get the unexpected result that no tests are executed: > > The let here is, I believe a red herring. Again, with what I'm > seeing, this form executes the same way as the above and runs exactly > zero tests. > > > Seems there is something going on with namespaces that I do not > > understand and I hope that somewhere here can explain it. > > I think I can explain the above behavior and suggest a way to obtain > the behavior you want. > I don't think it has as much to do with namespaces as it does with the > evaluation rule and it's relationship to def. > > You've defined a do, which will execute each of the forms in turn, but > the deftest (a macro which expands to a def form) creates it's test > function in the namespace that the do was executed in, not the > namespace created and switched to just previously. > > In fact, if you check your namespace, you should see that test1 is > defined not in ns01/ns02, but in user (or whichever namespace you > executed the do from). > > What I can't sufficiently explain is why def doesn't see the binding > of *ns* but run-tests obviously does, as it tries to find all tests > defined in ns01/ns02 (of which there are none). > (println (do > (ns ns03 > (:use clojure.test)) > (binding [*ns* (find-ns 'ns03)] > (deftest test3 nil)) > (run-tests))) > > Now, when the do evaluates the second form, it uses the namespace that > was created by the first form. > > Hope this helps. > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group > athttp://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en