Clojure基础: require和namespace

一个很小的, 很基础的Clojure问题, 折腾了好久. 想要使用某个jar中的某个namespace中的函数, 一直提示namespace not found. 为此升级了Clojure版本和JDK版本, 仍然不行. 其实只需要先require一下或者use这个namespace就解决问题.

原因在于我有了一种思维定势, 即认为加载clj文件和class文件的方式是一样的. 如果一个jar文件中同时又clj文件和class, 文件, 那么只要jar文件在classpath范围内, JVM启动的时候加载了jar文件, 那么所有的class文件就是可用的, 但是要使用全名, 例如java.util.Date, 当然你也可以import一遍, 这样就可以直接使用类名Date. 这是因为这些文件是JVM自动载入的.

但是clj文件则完全不同, JVM肯定是不认识这些文件的, 加载它们实际上需要在Clojure内部来做, 里面的代码并没有事先执行, 而是在require或者use的时候动态的执行, 就好象load-file一样. 如果加载的文件中又require了其他的namespace, 那么不需要再次require他们就可以使用, 但是凡是没有涉及到的, 仍然要手动require. 自动加载的namespace只有在user namespace中的clojure.core.

我因为习惯了准备好jar之后, 就可以直接加载class文件, 从而认为namespace也是一样. 也是因为一直以来对这个区别没有一个完整的了解.