Function 有没有办法将'require'和'import'范围限定到函数内部?
我对Clojure中的Function 有没有办法将'require'和'import'范围限定到函数内部?,function,clojure,dependencies,Function,Clojure,Dependencies,我对Clojure中的requires和imports的范围有点困惑。我是否可以要求依赖项只保留在函数的范围内 当我执行如下操作时,我会得到显示的错误 user=> (defn test1 [x] (require '[taoensso.timbre :as timbre]) (timbre/log x)) CompilerException java.lang.RuntimeException: No such namespace: timbre, compiling:(/tmp/fo
require
s和import
s的范围有点困惑。我是否可以要求依赖项只保留在函数的范围内
当我执行如下操作时,我会得到显示的错误
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)
不,这些仅设计用于您的
ns
表单。不,这些仅设计用于您的ns
表单。我不确定您将require
语句移出ns
声明的动机。require
语句说明了该命名空间的依赖关系
如果这些依赖项只涉及命名空间的某些函数,则可以考虑将这些函数移动到不同的命名空间中,从而释放依赖项的第一命名空间,以及创建更松散的耦合。
我不确定您将require
语句移出ns
声明的动机。require
语句说明了该命名空间的依赖关系
如果这些依赖项只涉及命名空间的某些函数,则可以考虑将这些函数移动到不同的命名空间中,从而释放依赖项的第一命名空间,创建更松散的耦合。
我并不反对Grav的建议——这是一种选择——但我不认为加载依赖项仅用于一个函数有什么缺点 有时,有理由使用ns
或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名称空间暂时可用,但这通常是应该避免的
和许多人一样,这是我最喜欢的名称空间介绍。我并不反对Grav的建议——这是一个选项——但我不认为加载仅用于一个函数的依赖项有什么缺点
有时,有理由使用ns
或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名称空间暂时可用,但这通常是应该避免的
和许多人一样,这是我最喜欢的名称空间介绍。我想你的意思是说:require
只能在ns
表单中使用require
可以在ns
之外使用,虽然这当然不常见,但在repl提示符下除外。你说的是真的,但这不是我想说的。这个问题的重点是如何要求事情“范围化”到一个特定的函数,重要的是答案是“不,你不能这样做,这是你应该做的”。您可以从repl调用require
,这一事实实际上并不相关,只会让提出此问题的人混淆问题。我想您的意思是说:require
只能在ns
表单中使用require
可以在ns
之外使用,虽然这当然不常见,但在repl提示符下除外。你说的是真的,但这不是我想说的。这个问题的重点是如何要求事情“范围化”到一个特定的函数,重要的是答案是“不,你不能这样做,这是你应该做的”。您可以从repl调用require
,这一事实实际上并不相关,只会让提出此问题的人混淆问题。每个人都警告我,这是一种必须避免的行为。现在,很明显,这对于你的日常Clojure代码来说是正确的。只是为了子孙后代,我想承认,除非是为了某种特殊情况下的黑魔法,否则我不会这么做。那样的话,就没问题了。:-)每个人都在警告我,这是应该避免的。现在,很明显,这对于你的日常Clojure代码来说是正确的。只是为了子孙后代,我想承认,除非是为了某种特殊情况下的黑魔法,否则我不会这么做。那样的话,就没问题了。:-)