This is because the macros are expanded by Clojure so inside a macro, it always 
looks like :clj. Take a look at how Expectations gets around this:

 

https://github.com/jaycfields/expectations/blob/master/src/cljc/expectations/platform.cljc#L9-L21

 

I’d love to hear if there’s an “official” recommended way to deal with reader 
conditionals in macros used from ClojureScript?

 

Sean Corfield -- (904) 302-SEAN
An Architect's View -- http://corfield.org/

"If you're not annoying somebody, you're not really alive."
-- Margaret Atwood


 

On 5/20/16, 10:34 AM, "hiskennyness" <clojure@googlegroups.com on behalf of 
kentil...@gmail.com> wrote:

 

My next problem with .cljc (which is going very very well overall!) has to do 
with macros.

 

Should I mention that I am building under Figwheel? This toolchain stuff has 
this old Lisper's head spinning.

 

Without a conditional, code using this macro compiles fine (the key bit being 
where I offer devs a little syntactic sugar in coding up defobserver so they 
can omit the dispatching types js/object  (which I myself rarely specify):

 

(defmacro defobserver [slot types params & body]

     (assert (keyword? slot) "defobserver> slot should be a keyword.")

     (let [ftypes (concat types (take-last (- 3 (count types))

                                           
'(::tiltontec.modeller.cell-types/model

                                             js/object js/object)))

           fparams (concat params

                           (take-last (- 4 (count params))

                                      '(me new-value old-value c)))]

       `(defmethod tiltontec.modeller.observer/observe [~slot ~@ftypes][~'slot 
~@fparams]

          ~@body)))


But on clj those need to be Object. So I tried this (after wrapping the above 
in #?(:cljs ...):

 

#_(:clj

   (defmacro defobserver [slot types params & body]

     (assert (keyword? slot) "defobserver> slot should be a keyword.")

     (let [ftypes (concat types (take-last (- 3 (count types))

                                           
'(::tiltontec.modeller.cell-types/model

                                             Object Object)))

           fparams (concat params

                           (take-last (- 4 (count params))

                                      '(me new-value old-value c)))]

       `(defmethod tiltontec.modeller.observer/observe [~slot ~@ftypes][~'slot 
~@fparams]

          ~@body))))


And in fact, that was a brave attempt to salvage my original attempt, which 
conditionalized just the types:

 

#?(:clj Object :cljs js/object)

 

I repeated that twice, but just realized this would have been a good spot for 
the splicing variant.

 

Anyway, no matter what I do I get a warning compiling to cljs that Object is 
unknown, and indeed a macroexpand-1 of '(defobserver :fu [nil][_ _ _ _] 42) 
shows Object where I should be seeing js/object.

 

I am also getting the same problem with an unrelated macro in which I am trying 
to conditionalize between dosync and do. Interestingly, I just noticed the same 
macro conditionally chooses between Exception. and js/Error. and I am not 
seeing warnings there!

 

Is this another known issue?

 

ps. I will try the old trick of having a helper defn with-defobserver and 
with-whatever to see if this is purely a macro interaction.

 

 

 

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to