Re: syntax quoting and namespaces misbehaving in test?
Thanks for your replies. Do you think this is a bug, given that the documentation doesn't seem to concur with this behaviour? On Aug 15, 9:54 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Wow, forget everything I said, this has nothing to do with macro expansion. Looks more like inside a function you can only def something in the same namespace as the function: user (defn ff [] (in-ns 'foo.core2) (def anything5 10)) #'user/ff user anything5 Var user/anything5 is unbound. [Thrown class java.lang.IllegalStateException] user (ff) #'user/anything5 foo.core2 (in-ns 'foo.core2) #Namespace foo.core2 foo.core2 (def anything6 10) #'foo.core2/anything6 On Mon, Aug 15, 2011 at 9:36 PM, Mark Rathwell mark.rathw...@gmail.com wrote: You are correct, I must have messed something up in my expansions. From the below, however, it looks like a var is being declared just by having the macro called, but not bound to the value: user (defmacro foo [name body] `(def ~name ~(identity `(fn [] ~@body #'user/foo user (foo xx (in-ns 'foo.core) (def anything3 10)) #'user/xx user anything3 Var user/anything3 is unbound. [Thrown class java.lang.IllegalStateException] user anything4 Unable to resolve symbol: anything4 in this context [Thrown class java.lang.Exception] On Mon, Aug 15, 2011 at 8:56 PM, Alan Malloy a...@malloys.org wrote: I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- 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
Re: syntax quoting and namespaces misbehaving in test?
The def special form seems to be a bit strange that way, in that (def sym thingy) seems to do two things: execute a (declare sym) at read or macroexpansion time, even when inside a function definition rather than at top level, and execute an (alter-var-root! sym (constantly thingy)) when actually reached by flow of control. If you want runtime-only def behavior you need to either use the namespace object's intern methods via interop or use (eval `(def ~sym ~thingy)). -- Protege: What is this seething mass of parentheses?! Master: Your father's Lisp REPL. This is the language of a true hacker. Not as clumsy or random as C++; a language for a more civilized age. -- 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
Re: syntax quoting and namespaces misbehaving in test?
I *think* it is expected behavior. Take this with a grain of salt, but I *think* that defs are namespace resolved at compile time, and so will not be checking in-ns calls within a function to determine the appropriate namespace, but will instead always use the ns of the function containing the def. - Mark On Tue, Aug 16, 2011 at 2:54 PM, Richard Rattigan ratti...@gmail.com wrote: Thanks for your replies. Do you think this is a bug, given that the documentation doesn't seem to concur with this behaviour? On Aug 15, 9:54 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Wow, forget everything I said, this has nothing to do with macro expansion. Looks more like inside a function you can only def something in the same namespace as the function: user (defn ff [] (in-ns 'foo.core2) (def anything5 10)) #'user/ff user anything5 Var user/anything5 is unbound. [Thrown class java.lang.IllegalStateException] user (ff) #'user/anything5 foo.core2 (in-ns 'foo.core2) #Namespace foo.core2 foo.core2 (def anything6 10) #'foo.core2/anything6 On Mon, Aug 15, 2011 at 9:36 PM, Mark Rathwell mark.rathw...@gmail.com wrote: You are correct, I must have messed something up in my expansions. From the below, however, it looks like a var is being declared just by having the macro called, but not bound to the value: user (defmacro foo [name body] `(def ~name ~(identity `(fn [] ~@body #'user/foo user (foo xx (in-ns 'foo.core) (def anything3 10)) #'user/xx user anything3 Var user/anything3 is unbound. [Thrown class java.lang.IllegalStateException] user anything4 Unable to resolve symbol: anything4 in this context [Thrown class java.lang.Exception] On Mon, Aug 15, 2011 at 8:56 PM, Alan Malloy a...@malloys.org wrote: I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- You received this
Re: syntax quoting and namespaces misbehaving in test?
100% expected. Try (def other.ns/some-var 1) - the compiler tells you it's illegal. If you read the compiler source, it's looking at the var's namespace and refusing to def it if it's not the current namespace. If you want behavior like this, you want (intern), not (def). On Aug 16, 12:07 pm, Mark Rathwell mark.rathw...@gmail.com wrote: I *think* it is expected behavior. Take this with a grain of salt, but I *think* that defs are namespace resolved at compile time, and so will not be checking in-ns calls within a function to determine the appropriate namespace, but will instead always use the ns of the function containing the def. - Mark On Tue, Aug 16, 2011 at 2:54 PM, Richard Rattigan ratti...@gmail.com wrote: Thanks for your replies. Do you think this is a bug, given that the documentation doesn't seem to concur with this behaviour? On Aug 15, 9:54 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Wow, forget everything I said, this has nothing to do with macro expansion. Looks more like inside a function you can only def something in the same namespace as the function: user (defn ff [] (in-ns 'foo.core2) (def anything5 10)) #'user/ff user anything5 Var user/anything5 is unbound. [Thrown class java.lang.IllegalStateException] user (ff) #'user/anything5 foo.core2 (in-ns 'foo.core2) #Namespace foo.core2 foo.core2 (def anything6 10) #'foo.core2/anything6 On Mon, Aug 15, 2011 at 9:36 PM, Mark Rathwell mark.rathw...@gmail.com wrote: You are correct, I must have messed something up in my expansions. From the below, however, it looks like a var is being declared just by having the macro called, but not bound to the value: user (defmacro foo [name body] `(def ~name ~(identity `(fn [] ~@body #'user/foo user (foo xx (in-ns 'foo.core) (def anything3 10)) #'user/xx user anything3 Var user/anything3 is unbound. [Thrown class java.lang.IllegalStateException] user anything4 Unable to resolve symbol: anything4 in this context [Thrown class java.lang.Exception] On Mon, Aug 15, 2011 at 8:56 PM, Alan Malloy a...@malloys.org wrote: I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10
Re: syntax quoting and namespaces misbehaving in test?
On Aug 15, 6:16 am, Richard Rattigan ratti...@gmail.com wrote: I don't understand why this test would fail - can anyone explain why? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespaces (in-ns 'my.new.namespace) (is (= my.new.namespace (str *ns*))) (is (= `anything 'my.new.namespace/anything))) expected: (= (quote learn.clojure.test.core/anything) (quote my.new.namespace/anything)) actual: (not (= learn.clojure.test.core/anything my.new.namespace/ anything)) When I try this on the REPL, it seems to work as expected: user= (in-ns 'my.new.namespace) #Namespace my.new.namespace my.new.namespace= `anything my.new.namespace/anything The syntax quoting happens at read time, before in-ns is executed. You can do something similar at the repl: user= (do (in-ns 'tmp) `foo) user/foo -- 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
Re: syntax quoting and namespaces misbehaving in test?
Okay, that makes sense - although it does seem potentially confusing. Thanks! On Aug 15, 1:42 pm, Alan Malloy a...@malloys.org wrote: On Aug 15, 6:16 am, Richard Rattigan ratti...@gmail.com wrote: I don't understand why this test would fail - can anyone explain why? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespaces (in-ns 'my.new.namespace) (is (= my.new.namespace (str *ns*))) (is (= `anything 'my.new.namespace/anything))) expected: (= (quote learn.clojure.test.core/anything) (quote my.new.namespace/anything)) actual: (not (= learn.clojure.test.core/anything my.new.namespace/ anything)) When I try this on the REPL, it seems to work as expected: user= (in-ns 'my.new.namespace) #Namespace my.new.namespace my.new.namespace= `anything my.new.namespace/anything The syntax quoting happens at read time, before in-ns is executed. You can do something similar at the repl: user= (do (in-ns 'tmp) `foo) user/foo -- 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
Re: syntax quoting and namespaces misbehaving in test?
I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) On Aug 15, 1:42 pm, Alan Malloy a...@malloys.org wrote: On Aug 15, 6:16 am, Richard Rattigan ratti...@gmail.com wrote: I don't understand why this test would fail - can anyone explain why? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespaces (in-ns 'my.new.namespace) (is (= my.new.namespace (str *ns*))) (is (= `anything 'my.new.namespace/anything))) expected: (= (quote learn.clojure.test.core/anything) (quote my.new.namespace/anything)) actual: (not (= learn.clojure.test.core/anything my.new.namespace/ anything)) When I try this on the REPL, it seems to work as expected: user= (in-ns 'my.new.namespace) #Namespace my.new.namespace my.new.namespace= `anything my.new.namespace/anything The syntax quoting happens at read time, before in-ns is executed. You can do something similar at the repl: user= (do (in-ns 'tmp) `foo) user/foo -- 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
Re: syntax quoting and namespaces misbehaving in test?
deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. - Mark On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) On Aug 15, 1:42 pm, Alan Malloy a...@malloys.org wrote: On Aug 15, 6:16 am, Richard Rattigan ratti...@gmail.com wrote: I don't understand why this test would fail - can anyone explain why? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespaces (in-ns 'my.new.namespace) (is (= my.new.namespace (str *ns*))) (is (= `anything 'my.new.namespace/anything))) expected: (= (quote learn.clojure.test.core/anything) (quote my.new.namespace/anything)) actual: (not (= learn.clojure.test.core/anything my.new.namespace/ anything)) When I try this on the REPL, it seems to work as expected: user= (in-ns 'my.new.namespace) #Namespace my.new.namespace my.new.namespace= `anything my.new.namespace/anything The syntax quoting happens at read time, before in-ns is executed. You can do something similar at the repl: user= (do (in-ns 'tmp) `foo) user/foo -- 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 -- 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
Re: syntax quoting and namespaces misbehaving in test?
Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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
Re: syntax quoting and namespaces misbehaving in test?
Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- 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
Re: syntax quoting and namespaces misbehaving in test?
I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- 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
Re: syntax quoting and namespaces misbehaving in test?
You are correct, I must have messed something up in my expansions. From the below, however, it looks like a var is being declared just by having the macro called, but not bound to the value: user (defmacro foo [name body] `(def ~name ~(identity `(fn [] ~@body #'user/foo user (foo xx (in-ns 'foo.core) (def anything3 10)) #'user/xx user anything3 Var user/anything3 is unbound. [Thrown class java.lang.IllegalStateException] user anything4 Unable to resolve symbol: anything4 in this context [Thrown class java.lang.Exception] On Mon, Aug 15, 2011 at 8:56 PM, Alan Malloy a...@malloys.org wrote: I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- 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 -- 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
Re: syntax quoting and namespaces misbehaving in test?
Wow, forget everything I said, this has nothing to do with macro expansion. Looks more like inside a function you can only def something in the same namespace as the function: user (defn ff [] (in-ns 'foo.core2) (def anything5 10)) #'user/ff user anything5 Var user/anything5 is unbound. [Thrown class java.lang.IllegalStateException] user (ff) #'user/anything5 foo.core2 (in-ns 'foo.core2) #Namespace foo.core2 foo.core2 (def anything6 10) #'foo.core2/anything6 On Mon, Aug 15, 2011 at 9:36 PM, Mark Rathwell mark.rathw...@gmail.com wrote: You are correct, I must have messed something up in my expansions. From the below, however, it looks like a var is being declared just by having the macro called, but not bound to the value: user (defmacro foo [name body] `(def ~name ~(identity `(fn [] ~@body #'user/foo user (foo xx (in-ns 'foo.core) (def anything3 10)) #'user/xx user anything3 Var user/anything3 is unbound. [Thrown class java.lang.IllegalStateException] user anything4 Unable to resolve symbol: anything4 in this context [Thrown class java.lang.Exception] On Mon, Aug 15, 2011 at 8:56 PM, Alan Malloy a...@malloys.org wrote: I either disagree or don't understand. The deftest macro doesn't touch your body arg; it's expanded as-is. For example, (let [x 'foo] `(inc ~x)) doesn't result in foo getting qualified, and most macros behave the same way. On Aug 15, 4:36 pm, Mark Rathwell mark.rathw...@gmail.com wrote: Just to be clear, it is namespace resolved because of syntax quote: (defmacro deftest [name body] (when *load-tests* `(def ~(vary-meta name assoc :test `(fn [] ~@body)) (fn [] (test-var (var ~name)) On Mon, Aug 15, 2011 at 7:23 PM, Alan Malloy a...@malloys.org wrote: Is it? That's neat; I guess I've never thought about how the compiler treats def. Thanks for the explanation. On Aug 15, 3:03 pm, Mark Rathwell mark.rathw...@gmail.com wrote: deftest is a macro. Macros are expanded at compile time. So, in this case, at compile time, a function called namespace2 is def'd with meta data :test set to the body of your deftest. All of that body is namespace resolved in macro expansion, before in-ns is ever executed (which happens when you actually call the namespace2 function created by the macro). Put another way, (def anything 10) is namespace resolved to (def learn.clojure.test.core/anything 10) at macro expansion time (compile time), before the test function is ever called, and thereby before in-ns is ever executed. Hope this helps. On Mon, Aug 15, 2011 at 5:07 PM, Richard Rattigan ratti...@gmail.com wrote: I'm finding that namespaces don't seem to behave as I expect intuitively, or according to the reference. It's quite possible I'm in the wrong here though, as I'm just kicking clojure's tires at this point. Here is the relevant doc: http://clojure.org/special_forms (def symbol init?) Creates and interns or locates a global var with the name of symbol and a namespace of the value of the current namespace (*ns*). In the test below, which succeeds, the var does not appear to end up in the current namespace per this definition. Am I misinterpreting something, or is this a deviation from the spec/reference? (ns learn.clojure.test.core (:use [clojure.test])) (deftest namespace2 (in-ns 'my.new.namespace) ;confirm the current namespace (is (= my.new.namespace (str *ns*))) ;attempt to def a var in the current namespace (def anything 10) ;the var is not defined in the current namespace (is (nil? (ns-resolve *ns* 'anything))) ;the var is however definined in the orginal namespace (is (not (nil? (ns-resolve (find-ns 'learn.clojure.test.core) 'anything (is (= 10 learn.clojure.test.core/anything))) -- 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 -- 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 -- 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