just for the record, it seems you can resolve CLJS vars at compile time to get their metadata by using (cljs.analyzer/resolve-var (dissoc &env :locals) varsym) (thanks @w01fe*)*
Saludos, Nahuel Greco. On Sat, May 31, 2014 at 12:43 PM, Nahuel Greco <[email protected]> wrote: > You already answered the println question, now I'm using spit inside the > macro instead of println, let's forget about it. Now the problem is to > access CLJS vars at compile time from the macro, not printing them :) > > The issue seems to be reduced to the question if you can access the CLJS > compiler state from a macro, to use utilities like cljs.core/resolve-var. > > Saludos, > Nahuel Greco. > > > On Sat, May 31, 2014 at 12:25 PM, Gary Trakhman <[email protected]> > wrote: > >> We still have to consider that println won't work, even if it is possible >> to resolve the var, so you'll have to use some other method to see the >> data: >> https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L897 >> >> >> On Sat, May 31, 2014 at 11:21 AM, Gary Trakhman <[email protected]> >> wrote: >> >>> Hrmmmmmm.. >>> >>> >>> https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/analyzer.clj#L1397 >>> >>> Seems like it *could* be getting passed through somehow. >>> >>> Now I'm confused :-). >>> >>> >>> >>> >>> On Sat, May 31, 2014 at 11:15 AM, Gary Trakhman <[email protected] >>> > wrote: >>> >>>> Why are you bringing the built-in macro &env into this? >>>> >>>> Cljs.core/resolve-var refers to this env: >>>> https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/env.clj#L39 >>>> >>>> AFAIK there is no link between them (I could be wrong). >>>> >>>> >>>> On Sat, May 31, 2014 at 10:39 AM, Nahuel Greco <[email protected]> >>>> wrote: >>>> >>>>> 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. >>>>> >>>> >>>> >>> >> -- >> 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.
