On Saturday, October 15, 2016 at 10:17:15 PM UTC-5, Josh Tilles wrote: > > I’ve got a couple questions for Alex Miller and/or the other Cognitect > folks. > > 1. *Are single-segment namespaces still “bad” when it comes to > registering specs under qualified keywords?* > > I will give a qualified *sometimes*. :) There are several possible contexts and I would not give the same answer for all of them.
If you are creating a library, particularly a library that will interoperate with other libraries, I would strongly recommend using namespaced keywords with sufficient namespaces that you will not clash with others. In some cases, a library may be well-entrenched or well-known enough to make a single namespace sufficient. For example, consider ring request/response maps and middleware, which is a prime example for interoperable libraries. If you were creating a Ring session middleware, you might want to use namespace keys in the request like :ring.session/token (or whatever, don't compare this to any actual existing lib). Here, "ring" is probably sufficiently established to be unambiguous and "ring.session" scopes you to something narrower. I think that's highly preferable to just :ring/token. If you're creating a brand new library designed for interoperation with other libs, I would strongly consider using more than a single segment namespace that combines some notion of organization and project. If you're creating an internal application, I think you're free to do whatever you want. So a single segment path in the context of a single application might be totally fine - :domain/email. As long as you're not colliding with some library and you coordinate in your private scope, do what communicates the best for you. If you have multiple internal projects that need to coordinate, you might need more namespace segments to disambiguate. > > 1. In the past, single-segment namespaces have been discouraged in the > Clojure community—both because of Java interop concerns and because of the > possibility of name-collision when combining projects. However, many of > the > spec examples I’ve seen have demonstrated registering specs under keywords > qualified by a single-segment namespace. For example, the guide’s > section on multi-spec <http://clojure.org/guides/spec#_multi_spec> > defines :search/url and :error/message. Is that because > namespace-qualifiers of specs shouldn’t be under the same constraints as > namespaces used to organize code? > > These short names are mostly chosen to make the examples brief and readable, although they might be sufficient when used in an application as mentioned above. However, I think it is important to note that your namespace qualifiers do NOT need to correspond to your code. You can use create-ns and alias to create shorter names in the context of a particular namespace just to save typing, while still using namespaces independent from your code. We are considering changing alias to automatically create a ns if it does not exist (see http://dev.clojure.org/jira/browse/CLJ-2030). > > 1. I’m *guessing* not; it seems more likely that the single-segment > namespaces have been used only to keep the code snippets straightforward > and focused on spec, and that “real” code would alias (e.g.) > my-company.my-project.search as search before defining a ::search/url > spec. > > Yes. > > 1. > 2. *When designing, how do you decide whether to use a simple keyword > or a qualified one?* > There’s an interesting mix of the two in the official docs and in the > code for spec itself. For example: the spec rationale > <http://clojure.org/about/spec#_sequences> and guide > <http://clojure.org/guides/spec#_sequences> both use simple keywords > when labeling path components, and spec reports invocation errors for > instrumented functions with maps that exclusively use qualified keys at > the > “root” but simple keywords appear as values > > <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fclojure%2Fclojure%2Fblob%2Fclojure-1.9.0-alpha13%2Fsrc%2Fclj%2Fclojure%2Fspec%2Ftest.clj%23L394-L402&sa=D&sntz=1&usg=AFQjCNG7WXKKDD045BnZVx-2qTsrDQ8QuA> > > and as keys in nested maps > > <https://github.com/clojure/clojure/blob/clojure-1.9.0-alpha13/src/clj/clojure/spec.clj#L205> > . > > Path components are simple as they exist in the context of a particular spec which has a fully-qualified name. I suspect in general the other choices mostly follow that pattern - fully-qualified when they are used without context or when they might be intermingled with other keys and unqualified when used as keys in the scope of some other context. That said, things may not be 100% consistent in every possible case. Hope that helps! Alex > Thank you for your help. I really appreciate it. > > Best, > Josh > -- 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.