Personally, I like documentation in the same place as the code it documents.... And I'd love to have the tests in the same file as well.
In both cases, I think the things are highly coupled by their nature, and therefore I want them together (OK, tests aren't always - in the cases they aren't, put them in a separate file). I've reminded people that the SRP ("any piece of code should have one reason to change") implies the converse, which I phrase as "Code which changes together, stays together." That said, I like the idea of more structured documentation. (Possibly including test cases! Python has test runners which verify examples in doc strings, for example.) On Apr 26, 2014 4:31 PM, "Gary Trakhman" <gary.trakh...@gmail.com> wrote: > This is a lovely idea. > > I think prismatic schema is one well-accepted way to document data shapes, > but it's expected to be used inline. It would be nice to have flexibility > in what description systems are used in addition to flexibility of where > the docs live. > > I agree that being able to see and reason about bare code with no hassle > is a (personal) demotivator for documentation, but where the docs live > should be up to the implementor. Having a code-based system means we can > use and improve existing runtime tooling to navigate and interact with it. > This would make a great cider middleware :-). > > On Saturday, April 26, 2014, Val Waeselynck <val.vval...@gmail.com> wrote: > >> Hello to all, >> >> *Short version :* I think Clojure needs a documentation system in >> Clojure, I would like to know if some efforts exist in that direction, and >> I am willing to create it / contribute to it. >> >> *Long version :* >> >> I've been thinking for a while that the Clojure community could benefit a >> lot from a more sophisticated and ergonomic documentation system. >> >> I have seen some existing plugins like lein-sphinx, but I think it would >> be really good to have documentation that would be written in Clojure, for >> the following reasons : >> >> - we're all very fond of Clojure data structures and their syntax. (I >> don't know about you, but I find that even HTML looks better in >> Clojure <https://github.com/weavejester/hiccup> than in HTML). Plus, >> Clojure programmers already know how to edit them. >> - (better reason) The facts that Vars are first-class citizens and >> that symbols can be referred explicitly with hardly any ceremony (macros) >> are a exceptional opportunity to make smart and highly-structured >> documentation very easily. >> - if it's in Clojure, Clojure programmers can seamlessly build *ad >> hoc* documentation functionality on top of it to suit their own >> particular needs. >> >> I haven't found anything of the like yet, and if it exists, I would be >> grateful if someone would redirect me to it. >> >> Here are *my thoughts on this :* >> >> 1. Clojure doc-strings, although they are quite handy as reminders >> and for doc-indexation, are *too raw a content*. Even when they are >> done right, they tend to be cumbersome, and it's too bad to have such >> concise code drown in the middle of so much documentation. What's more, I >> believe that when programmers program a function (or anything), they tend >> to think more about the implementation than the (uninformed) usage, so >> they >> have little incentive to make it right. >> 2. Building on 1. having a system where documentation and programs >> live in separate files, in the same way as tests, would enforce a healthy >> separation of concerns. Importantly, it would make life much easier on the >> Version Control perspective. >> 3. Documentation should probably be made differently than what people >> have got accustomed to by classical languages. Because you seldom find >> types, and because IMHO Clojure programs are formed more by factoring out >> recurring mechanisms in code than from implementing intellectual >> abstractions, the relevant concepts tend not to be obvious in the code. >> Since in Clojure we program with verbs, not >> nouns<http://steve-yegge.blogspot.fr/2006/03/execution-in-kingdom-of-nouns.html>, >> I think *documentation is best made by example*. >> 4. Documentation of a Var should not be a formal description of what >> it is and what it does with some cryptically-named variables. *Every >> bit of documentation should be a micro-tutorial*. Emphasis should be >> put on usage, examples, tips, pitfalls, howtos. >> 5. There should be structure in the documentation, and it shouldn't >> be just :see-also links - *there should be semantics* in it. For >> example, some functions/macros are really meant to be nothing but >> shorthands for calling other functions : that kind of relationship should >> be explicitly documented. >> 6. Documentation should not be just information about each separate >> Var in a namespace. There should be a hierarchy to make the most useful >> elements of an API more obvious. Also, adding cross-vars documentation >> elements such as tags and topics could make it easier to navigate and >> understand. >> 7. *Documentation in the REPL is great*, it was one of the very good >> surprises when I started learning Clojure. However, a rich and >> good-looking >> presentation like in Javadocs would be welcome too. >> >> Of course, all of the above are just vague principles. Here is *some >> functionality I suggest for a start :* >> >> 1. Documentation content elements could be written in a Clojure DSL >> emulating some kind of docbook-like markup language. >> 2. On the user side, the documentation would be accessible through a >> generated web interface, a REPL interface, and maybe other formats like >> Wiki. >> 3. Documentation could be programmed anywhere in a project by simply >> referring to the relevant Vars and calling the documentation API. Ideally, >> there would be a dedicated folder for documentation files, and a Leiningen >> plugin to compile them and generate the HTML from them. >> 4. I often find myself lost because I have no idea what shape some >> arguments to a function should have, such as config maps and maps >> representing application-specific models. To adress this, I propose to >> explicitly declare and describe *"stereotypes"* in the documentation. >> Such stereotypes could be, for instance, "JDBC connection" or "Ring >> middleware". From what I have seen, some good >> work<https://github.com/prismatic/schema>has already been done in that >> direction, but it would be good to make room >> for it in documentation. >> 5. Weigh the documentation contents by importance, to allow for >> displaying the documentation with several levels of details. >> 6. Cross-vars, semantic documentation with *topics*, *tags*, and >> *links*. *Topics* would group several API elements together to >> explain a technique or concept; they could have a >> :prerequisiterelationship to help the reader navigate them. I imagine >> *tags* giving hints on various aspects of a Var, such as :curried for >> a function, or :utility, or :use-with-caution, etc. *Links* could be >> such things as the famous :see-also, but could also represent more >> precise relationships, such as :calls-to, :often-used-with, >> :similar-to, etc. >> 7. In addition to small, Var-specific, self-contained code samples, >> there could be larger examples (e.g sample applications), and pointers >> from >> the documentation to specific points in these examples. >> 8. There could be other types of documentation than just static >> description, such as exercises, koans, quizzes, etc. >> >> I would like to know what work has already been done in that direction, >> and if you agree that this is useful, I am willing to help design and >> implement it. >> >> Your reactions are very welcome. >> >> >> Bests, >> >> Valentin Waeselynck. >> >> >> -- >> 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. >> > -- > 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. > -- 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.