I'm a big fan of inline documentation and "light" versions of Literate Programming, because docs that are more than one screen away from code are always wrong. That this is ever a revelation to anyone suggests to me that they've never written code or read API docs.
When I write Python, I write:
>>> import math
>>> def foo(x):
"Square root of `x`"
return math.sqrt(x)
>>> foo(5)
2.23606797749979
>>> help(foo)
Help on function foo in module __main__:
foo(x)
Square root of `x`
Similarly in Java with Javadoc, I write:
/** Square root of {@code x} */
double foo(double x) {
return Math.sqrt(x);
}
Javadoc isn't usable on live code or in a REPL (Java doesn't really have one), but you get nice HTML docs out of it. Javascript & Node don't have an official tool, but most code is marked up with Javadoc.
Common LISP, archaic pain in the ass though it is, has:
(defun foo (x)
"Square root of `x`"
(sqrt x))
> (documentation 'foo 'function)
"Square root of `x`"
Sadly and typically, the Scheme situation is much less organized.
There's a Chicken 4 egg hahn which is ugly, @()
special forms and all the nested structures instead of just a string, but it's workable. Otherwise, everything seems to be external docs.
Racket has Scribble with a teeny-tiny side-note that you can put your docs in code, but no examples. There is a literate programming tool as well, but that's not quite what I'm after.
Chez Scheme has no solution, which is a little surprising given the "batteries included" philosophy.
Well, maybe I can get away with doing CLISP-type docstrings and worry about making a tool later? Does this extra junk hurt performance?
(import (chicken time))
(define (sqrt-without-docs x) (sqrt x))
(define (sqrt-with-docs x) "docs" (sqrt x))
(display "without docs\n")
(time {do [(i 0 (add1 i))] [(>= i 1000000)] (sqrt-without-docs i)})
(display "with docs\n")
(time {do [(i 0 (add1 i))] [(>= i 1000000)] (sqrt-with-docs i)})
In the interpreter, there's a 10-50% speed penalty (csi -s or in the REPL) for having that extra string created & GC'd, but compiled (csc), there's no noticeable difference. So I guess that's my solution for now.