有没有办法将`require`s和`import`s范围扩展到函数内部?

时间:2016-08-04 05:48:30

标签: function clojure dependencies

我对Clojure中requireimport的范围感到有些困惑。我可以以某种方式要求只保留在函数范围内的依赖项吗?

当我执行以下操作时,我会收到显示的错误。

user=> (defn test1 [x] (require '[taoensso.timbre :as timbre]) (timbre/log x))

CompilerException java.lang.RuntimeException: No such namespace: timbre, compiling:(/tmp/form-init1203922056301029971.clj:1:57) 

3 个答案:

答案 0 :(得分:4)

我不确定您将require声明移出ns声明的动机。 require语句表示该命名空间的依赖关系。

如果这些依赖关系仅与命名空间的某些函数相关,那么您可以考虑将这些函数移动到不同的命名空间中,从而释放第一个依赖关系命名空间,并创建更松散的耦合。

答案 1 :(得分:3)

不,这些只是用于ns表单。

答案 2 :(得分:1)

我不同意Grav的建议 - 这是一个选项 - 但是我没有看到加载依赖项只能用于一个函数的缺点。

偶尔有理由使用nsin-ns临时切换文件中的命名空间:

(ns foo.bar)

... more code here ...

(ns foo.parameters [:require foo.baz :as bz])
(def my-parm (bz/inc2 42))
(ns foo.bar)

您可以使用它来暂时使require d名称空间可用,但这通常应该避免。

与许多人一样,Colin Jones' blog post是我最喜欢的名称空间介绍。