But the call-chain is api/x-with-foo => foo/x => proto/X so it does bottom
out in the ns the protocol was defined in. It's just that the middle step
could come from 3 different namespaces all containing protocol extensions.

On Thu, 21 Nov 2019, 23:03 Justin Smith, <noisesm...@gmail.com> wrote:

> it might be helpful to consider that in the jvm methods are not data,
> and the proto function makes the method into concrete data belongs to
> the namespace that owns the protocol
>
> On Thu, Nov 21, 2019 at 2:58 PM Justin Smith <noisesm...@gmail.com> wrote:
> >
> > if you define proto method x, it belongs to the protocol namespace no
> > matter where it is called, and calling it as if it belonged to the
> > namespace defining the object extending the protocol will and should
> > fail
> >
> > On Thu, Nov 21, 2019 at 1:57 PM Dimitrios Jim Piliouras
> > <jimpil1...@gmail.com> wrote:
> > >
> > > Hi folks,
> > >
> > > This has me completely stumped - I would massively appreciate a
> helping hand! Suppose the following simple directory structure:
> > >
> > >
> > > — someProject.impl.{foo.clj, bar.clj,baz.clj}
> > > — someProject.proto.clj
> > > — someProject.api.clj
> > >
> > > `proto.clj` contains a single protocol with two methods - let’s call
> them X & Y. Each implementation namespace (foo, bar, baz), requires
> `[someProject.proto :as proto]`,  extends it to 3 types
> (bytes/chars/String), and defines two public fns x & y which delegate to
> `proto/X` & `proto/Y` respectively. Everything is good so far. I can fire
> up a REPL, load any of the impl  namespaces (foo, bar, baz), call the
> corresponding x or y fn and get the right result.
> > >
> > > Now, I want to provide a unified API so that the caller doesn’t need
> to (potentially) require 3 namespaces. Hence the `someProject.api` ns,
> which contains require clauses for all impl namespaces + two multi-methods
> `X-with` & `Y-with` with 3 implementations (`defmethod`) each. Each
> implementation delegates to the x or y fn in the right impl namespace. In
> other words,  `X-with :foo` calls `(foo/x)`, `X-with :bar` calls `(bar/x)`
> etc etc. Remember, that calling x or y inside any impl namespace works
> correctly, so all I’m doing here is providing a multi-method wrapper.
> However, things don’t work as I was expecting in this namespace…Loading
> `someProject.api` in a fresh REPL and calling  `X-with :foo` bottoms out at
> the protocol extension for X in the baz ns, which is the last require
> clause in the api namespace.
> > >
> > > So basically,  the protocol extensions in each impl namespace work
> fine when called from their wrapper fn in the namespace they were defined,
> but don’t quite work when the same wrapper fn is called from some other
> namespace! What am I missing? :(
> > >
> > > Many thanks in advance…
> > > Dimitris
> > >
> > >
> > > --
> > > 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.
> > > To view this discussion on the web visit
> https://groups.google.com/d/msgid/clojure/A549FB15-0B12-4E20-9D98-4F5A56330DC4%40gmail.com
> .
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/clojure/CAGokn9%2B1ZiFHBzuS_bwSyrx0DsM_ocu7dk844DnU-h5D3b9fzA%40mail.gmail.com
> .
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/clojure/CAE3Kzw%2B6BqfX3di1xgE8UM2ngpBBhdzCi4GpCEtAeVX56oyGEg%40mail.gmail.com.

Reply via email to