I will reformulate: can you access the CLJS compiler state from a macro via &env or in another way to resolve CLJS vars? If yes, can you use cljs.core/resolve-var from a macro giving it that &env? Or the macros run completely isolated from the CLJS compiler state?
Saludos, Nahuel Greco. On Sat, May 31, 2014 at 11:23 AM, Nahuel Greco <[email protected]> wrote: > Gary, maybe I'm misunderstanding you, but cljs.core/resolve-var doesn't > contradict your "the macro system has no knowledge of the CLJS compiler > internals" stance? What's the intent of that function (given that trying it > in my original example doesn't seems to be capable of resolving the var)? > It can access the vars defined in the CLJS side? > > Saludos, > Nahuel Greco. > > > On Sat, May 31, 2014 at 11:13 AM, Gary Trakhman <[email protected]> > wrote: > >> The other piece of the puzzle: >> >> cljs.core/resolve-var is in a CLJ namespace and uses compiler state: >> >> https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/core.clj#L681 >> >> >> On Sat, May 31, 2014 at 10:10 AM, Gary Trakhman <[email protected]> >> wrote: >> >>> The key is in what you think you mean by 'available at compile-time'. >>> >>> How could this be the case? >>> >>> The macro system has no knowledge of the CLJS compiler internals, and >>> the CLJS compiler does not try to project its state onto the clojure >>> namespace system. >>> >>> However, CLJ macros can return symbols in data that will eventually make >>> sense in a CLJS context, without having any knowledge of that CLJS context, >>> which is the case. >>> >>> >>> On Sat, May 31, 2014 at 9:47 AM, Nahuel Greco <[email protected]> wrote: >>> >>>> Thomas, this is an isolated test, the real case was creating a defmulti >>>> macro wrapper and a defmethod one, so in the mydefmulti macro I attach >>>> some metadata to the var defmulti defines and then I fetch it in the >>>> mydefmethod calls (by using resolve), all in compile-time. This works >>>> perfectly in the pure CLJ case but not in the CLJS one. The nested def >>>> in my original example was an extra experiment, because for testing I need >>>> to put nested def's inside deftest's, but note the problem manifests >>>> also with the top-level def, so nesting the def is not really the >>>> problem here. >>>> >>>> The vars needs to be defined on the CLJS side, I thought they were >>>> available at compile-time for the macros like in CLJ. So if standard >>>> resolve and his friends doesn't work, there is a way using the >>>> analyzer and &env from the macro to get that CLJS compile-time var and >>>> his metadata? I'm discovering functions like cljs.core/resolve-var but >>>> doing (cljs.core/resolve-var &env v) in the macro from my original >>>> example doesn't seems to resolve anything. >>>> >>>> I think for my real case there is a workaround by defining a (def >>>> my-metadata-for-cljs-vars (atom {})) in macros.clj and then update it >>>> in the mydefmulti calls using the fully qualified var sym as a key and >>>> the data (originally stored in the metadata) as the value, then read it >>>> from the mydefmacro calls. I think that will work, but I really want >>>> to know if resolving the CLJS var and getting his metadata from the macro >>>> is possible. >>>> >>>> >>>> Saludos, >>>> Nahuel Greco. >>>> >>>> >>>> On Sat, May 31, 2014 at 5:50 AM, Thomas Heller <[email protected]> >>>> wrote: >>>> >>>>> Hey, >>>>> >>>>> not sure what you are trying to achieve, since the compiler should >>>>> already warn you if a var is not found. Might not do so when nesting defs. >>>>> def/defn are top level forms und should not be nested, especially no def >>>>> in >>>>> a defn. >>>>> >>>>> As for your question: the CLJS compiler supports vars in macros, but >>>>> only on the clojure side (eg. in your macros.clj). Your macros may >>>>> reference other vars from the CLJ world but know nothing about the CLJS >>>>> world (expect maybe from &env). >>>>> >>>>> HTH, >>>>> /thomas >>>>> >>>>> -- >>>>> Note that posts from new members are moderated - please be patient >>>>> with your first post. >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "ClojureScript" 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]. >>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>>> >>>> >>>> -- >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "ClojureScript" 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]. >>>> Visit this group at http://groups.google.com/group/clojurescript. >>>> >>> >>> >> -- >> Note that posts from new members are moderated - please be patient with >> your first post. >> --- >> You received this message because you are subscribed to the Google Groups >> "ClojureScript" 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]. >> Visit this group at http://groups.google.com/group/clojurescript. >> > > -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" 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]. Visit this group at http://groups.google.com/group/clojurescript.
