There are sound arguments, with which I agree, that things like
Clojure's vars are necessary for program modularity:
http://lambda-the-ultimate.org/classic/message9361.html
Clojure's vars ensure thread independence and stack unwinding, so are
not 'disgusting' in the way globals are in other languages. I'm glad
you tried it, as I am satisfied with the defaults for prn et al. You
can always build a version that takes a writer when that makes sense.
If there's enough demand I guess the library could have prn-to etc.
One example of when vars win over explicit args is when you want to
use library functions like map, which don't 'thread' the args you
need.
Another way to look at it is as a policy decision - i.e. To where are
we printing? akin to, Are we logging?, To where?, To what database
should we connect? etc. All things I find extremely cumbersome to
thread though code in languages without dynamic vars. I've seen apps
with lots of policy args being threaded through stacks of functions
that shouldn't know or care.
Rich