Phew! Got it working. Thanks for your tip, Dom. For some reason I had the idea 
that macros written for clojurescript needed to be expanded in a clojurescript 
repl. Once I realised that was incorrect things became much easier. In the end 
i just needed to also quote unquote the `IFn` protocol name like this:

(defmacro defthing [name args]
  `(defrecord ~name ~args
     ~'IFn
     (~'-invoke [this#] (str "Hello, " ~(first args)))))

On Sunday, October 19, 2014 2:40:49 PM UTC+1, Russell Dunphy wrote:
> Thanks, that's definitely a step in the right direction. It still doesn't 
> work, but there is now a function for arity 1 of invoke in the __proto__ map. 
> There's still a `true` value for cljs.core$ifn$-invoke however, which I'm 
> guessing is related to why it's not working.
> 
> I would desperately like to make use of the various macroexpands, but so far 
> I have had absolutely zero luck getting a working clojurescript repl that has 
> access to my application code. Going to spend some more time trying to get 
> that working now.
> 
> On Sunday, October 19, 2014 3:37:54 AM UTC+1, Dom Kiva-Meyer wrote:
> > You are resolving the protocol method symbol.
> > 
> > `(-invoke ...) expands to (your.namespace/-invoke ...)
> > 
> > 
> > To fix this, you need to quote (not syntax-quote) and unquote the symbol.
> > `(~'-invoke ...) expands to (-invoke ...)
> > 
> > 
> > Make liberal use of clojure.core/macroexpand, clojure.core/macroexpand-1, 
> > and clojure.walk/macroexpand-all when writing macros.
> > 
> > 
> > 
> > 
> > On Sat, Oct 18, 2014 at 4:58 PM, Russell Dunphy <[email protected]> 
> > wrote:
> > I'm having real difficulty trying to write a macro that creates a defrecord 
> > which implements certain protocols in Clojurescript.
> > 
> > 
> > 
> > I've created a minimal example project that shows the problem I'm having at 
> > https://github.com/rsslldnphy/cljs-protocols-in-macros
> > 
> > 
> > 
> > The example has two records, one created with a plain defrecord that 
> > implements IFn, the other that does exactly the same but in a macro. The 
> > plain defrecord works as expected, but the one created in a macro doesn't - 
> > it's not callable as a function.
> > 
> > 
> > 
> > Weirdly it returns true for (ifn?) however. Looking at the js console 
> > (screenshot in the repository) the macro created record seems to have a 
> > value of `true` in its __proto__ map for cljs.core.IFn (whereas all the 
> > other entries in the __proto__ map are functions, and the plain defrecord 
> > has function entries for the different arities of `invoke`).
> > 
> > 
> > 
> > I'm lost at this point (and new to Clojurescript). Am I doing something 
> > wrong? Is this even possible?
> > 
> > 
> > 
> > Thanks,
> > 
> > 
> > 
> > Russell
> > 
> > 
> > 
> > --
> > 
> > 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