The problem with our old solution is that if you called a macro in cljx
code, and that fn was itself called from Clojure code involved in
macroexpansion of ClojureScript, it would get the cljs version and barf.

I think our current solution mostly solves this, in that macros that want
to emit cross-platform code should emit forms like `(if-cljs cljs-form
clj-form) -- notice the backtick -- and even if they are called from other
macros, the ultimate expansion takes place in the correct target context (I
hope).

If a macro wants to directly switch on the env (rather than emitting an
if-cljs form) the env must be passed in from the parent, but in general I
think it seems like a better approach.  In any case, it seems to have
solved our immediate issues that some people were having with cljs
compilation, without breaking any tests.

In your specific example, there's no backtick before "if-cljs", which I
believe is causing the unexpected behavior (although I think your log fn
would have to be changed as well to emit a form, as is typical for macro
helper fns).  But I haven't actually tested this, so if this is incorrect
please let us know.


On Wed, Jun 18, 2014 at 10:30 PM, Nahuel Greco <[email protected]> wrote:

> I found a problem in the Chas approach. When you call a macro from a cljs
> file, and that macro calls another macro with a(:ns &env) test, it sees a
> Clojure &env, so it thinks is being compiled in a CLJ environment. This
> doesn't happens with the Prismatic approach (the old one, it was recently
> changed for the Chas one). See below:
>
> ;;;----- p/macros.clj ------
> (ns p.macros)
>
> (defn log [s]
>   (spit "/tmp/log" (str (pr-str s) "\n") :append true))
>
> (defmacro if-cljs      ;; Chas approach
>   [then else]
>   (log [:if-cljs-env &env])
>   (if (:ns &env) then else))
>
>
> (defn compiling-cljs?  ;; Prismatic (old) approach
>    []
>   (boolean
>    (when-let [n (find-ns 'cljs.analyzer)]
>      (when-let [v (ns-resolve n '*cljs-file*)]
>        @v))))
>
> (defmacro other-macro
>   []
>   (log [:other-macro-env &env])
>   (log [:if-cljs (if-cljs :cljs :clj)])
>   (log [:if-compiling-cljs (if (compiling-cljs?) :cljs :clj)]))
>
> ;;;----- p/core.cljs ------
> (ns p.macros
>    (:require-macros [p.macros]))
>
> (p.macros/other-macro)
>
> When you run this, you get the following contents in the /tmp/log file:
>
> [:if-cljs-env {&env #<LocalBinding
> clojure.lang.Compiler$LocalBinding@18b3f8f5>, &form #<LocalBinding
> clojure.lang.Compiler$LocalBinding@7a69c3fb>}]
> [:other-macro-env {:column 1, :line 14, :ns {:defs  .... }}]
> [:if-cljs :clj]                  ;;; WRONG!
> [:if-compiling-cljs :cljs]       ;;; CORRECT
>
> Note, [:if-cljs-env ...] is printed before [:if-cljs ...] as the if-cljs
> macro expands inside the other-macro definition before other-macro is
> executed from cljs.
>
> My question is, why the &env in the if-cljs macro call here is not a
> ClojureScript one? Bug or feature? :)
>
>
> Saludos,
> Nahuel Greco.
>
>
> On Tue, Jun 17, 2014 at 11:01 PM, Jason Wolfe <[email protected]> wrote:
>
>> Not anymore (thanks Chas):
>>
>> https://github.com/Prismatic/schema/pull/113
>>
>> On Tuesday, June 3, 2014 7:21:35 AM UTC-7, Nahuel Greco wrote:
>> > check what Prismatic schema uses:
>> https://github.com/Prismatic/schema/blob/master/src/clj/schema/macros.clj#L13-20
>> >
>> >
>> >
>> >
>> >
>> > Saludos,
>> > Nahuel Greco.
>> >
>> >
>> >
>> > On Tue, Jun 3, 2014 at 9:40 AM, Ambrose Bonnaire-Sergeant <
>> [email protected]> wrote:
>> >
>> >
>> >
>> >
>> >
>> > I would write two different macros.
>> >
>> >
>> > Thanks,
>> > Ambrose
>> >
>> >
>> >
>> >
>> >
>> >
>> > On Tue, Jun 3, 2014 at 8:07 PM, Максим Карандашов <[email protected]>
>> wrote:
>> >
>> >
>> >
>> >
>> >
>> >
>> > I want to find (in the macro call) what happens: Clojure or
>> ClojureScript compilation. It needed for using one name of macro inside
>> Clojure and ClojureScript.
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > Currently I use next approach:
>> >
>> >
>> >
>> > (if (nil? cljs.env/*compiler*)
>> >
>> >     (do-something-for-clojure)
>> >
>> >     (do-something-for-clojurescript))
>> >
>> >
>> >
>> > And it's working well. But maybe this is not correct? Or is there
>> another way to do this?
>> >
>> >
>> >
>> > --
>> >
>> > 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 a topic in the
> Google Groups "ClojureScript" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojurescript/iBY5HaQda4A/unsubscribe.
> To unsubscribe from this group and all its topics, 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