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.

Reply via email to