I recently started learning Clojure and I’m having a bit of difficulty wrapping my head around namespaces. As the creator of Clojure said, newcomers often struggle to get the concept right. I don’t clearly understand the difference between (use ...) and (require ...). For example playing around in the REPL if I say (use 'clojure.contrib.str-utils2) I get warnings about functions in clojure.core namespace being replaced by the ones in clojure.contrib.str-utils2, but that doesn’t happen when I use (require 'clojure.contrib.str-utils2). I’m not sure that I will always want to replace what’s in clojure.core, so can someone point some best practices for importing external stuff and managing namespaces in Clojure?
Oh and also, when should I use :use and :require? Only inside (ns ....)?
Thanks in advance.
The answer lies in the docstrings:
And the long one for require:
They both do the same thing, but
usegoes the extra step and creates mappings for the stuff in the require’d namespace in the current namespace. That way, rather than doingsome.namespace/nameyou’re just referring to it asname. While this is convenient sometimes, it’s better to use require or select the individual vars that you want rather than pull in the entire namespace. Otherwise, you could have issues with shadowing (where one var is preferred over another of the same name).If you don’t want to use require, but you know what vars you want out of the namespace, you can do this:
If you don’t know which vars you’re going to need, or if you need a lot, it’s better to use require. Even when you require, you don’t always have to type the totally qualified name. You can do this:
and then you can use vars from some.namespace like this:
(sn/somefunction arg1 arg2)And to answer your last question: try to only use :require and :use inside of (ns …). It’s much cleaner this way. Don’t
useandrequireoutside of (ns ..) unless you have a pretty good reason for it.