there is no foo/x unless you defined one - the protocol function is created by defprotocol and is not owned by the object implementing the protocol
On Thu, Nov 21, 2019 at 3:29 PM Dimitrios Jim Piliouras <jimpil1...@gmail.com> wrote: > > 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. -- 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%2BmXbWdKaN8c2eaCe3%2BVaF1Evc0kVWF4hLfHU_WHQvobw%40mail.gmail.com.