Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中从另一个命名空间转发声明变量?_Clojure - Fatal编程技术网

在Clojure中从另一个命名空间转发声明变量?

在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 []

我知道如何为当前名称空间转发声明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
  []
  (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;;=>#但是解决(+消除)依赖循环可能是解决您的问题的更好的方法,使将来对代码的更改变得更容易?根据我对大卫·詹姆斯建议的解释,这种行为与我所看到的是一致的。它应该如何工作?