on rereading I've clearly misunderstood you, I think we need to see actual code reproducing this error in order to know what failed here
On Thu, Nov 21, 2019 at 3:42 PM Justin Smith <noisesm...@gmail.com> wrote: > > 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%2BPgbiZxq-n7L%3DgLhqNB2z-OdCaTOx7uJA5zG2NavJLiQ%40mail.gmail.com.