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 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

Reply via email to