Ваш код не делает то, что вы, вероятно, думаете. Функция tst
выведет значение * ns *, var, в то время, когда функция run , а не когда определено .
user> (ns foobar)
nil
foobar> (abc/tst)
"test" #<Namespace foobar>
nil
foobar> (ns zelsbot)
nil
zelsbot> (abc/tst)
"test" #<Namespace zelsbot>
nil
То, что вы пытаетесь сделать, уже хорошо предоставлено clojure.contrib.with-ns
:
(ns xyz
(:use clojure.contrib.with-ns))
(with-ns (create-ns 'abc)
(defn tst [] (print "defined in namespace abc")))
Он оценивает свое тело в пространстве имен, которое вы указали в качестве первого аргумента, что позволяет вам добавлять функции в пространство имен, отличное от текущего.