在Clojure中从另一个命名空间转发声明变量?
我知道如何为当前名称空间转发声明var。相反,我想从另一个名称空间声明一个var。我该怎么做?这将帮助我消除循环负载依赖性 目前,这就是我所尝试的:在Clojure中从另一个命名空间转发声明变量?,clojure,Clojure,我知道如何为当前名称空间转发声明var。相反,我想从另一个名称空间声明一个var。我该怎么做?这将帮助我消除循环负载依赖性 目前,这就是我所尝试的: ; this_ns.clj (ns my-project.this-ns (:require ...)) (ns my-project.other-ns) (declare other-func) (ns my-project.this-ns) ; return to original namespace (defn func-1 []
; this_ns.clj
(ns my-project.this-ns
(:require ...))
(ns my-project.other-ns)
(declare other-func)
(ns my-project.this-ns) ; return to original namespace
(defn func-1
[]
(my-project.other-ns/other-func))
这是可行的,但我不喜欢。我认为您现有的解决方案是最简单的。如果将其包装到宏中,它看起来就不再那么糟糕了:
(defmacro declare-extern
[& syms]
(let [n (ns-name *ns*)]
`(do
~@(for [s syms]
`(do
(ns ~(symbol (namespace s)))
(declare ~(symbol (name s)))))
(in-ns '~n))))
称之为:
(declare-extern my.extern.ns/abc) ;; => #<Namespace ...>
my.extern.ns/abc ;; => #<Unbound Unbound: #'my.extern.ns/abc>
(声明extern my.extern.ns/abc);=>#
my.extern.ns/abc;;=>#但是解决(+消除)依赖循环可能是解决您的问题的更好的方法,使将来对代码的更改变得更容易?根据我对大卫·詹姆斯建议的解释,这种行为与我所看到的是一致的。它应该如何工作?