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.

Reply via email to