将别名命名空间动态加载到另一个Clojure命名空间
我试图在运行时从文件加载名称空间。对于这个名称空间,我希望有一个通用的别名,这样我就可以使用一个统一的、限定的名称从该名称空间访问函数,该名称空间独立于加载文件的实际名称空间 示例(不起作用): 我已经尝试了各种方法(将别名命名空间动态加载到另一个Clojure命名空间,clojure,namespaces,Clojure,Namespaces,我试图在运行时从文件加载名称空间。对于这个名称空间,我希望有一个通用的别名,这样我就可以使用一个统一的、限定的名称从该名称空间访问函数,该名称空间独立于加载文件的实际名称空间 示例(不起作用): 我已经尝试了各种方法(load file,load)并将require移动到不同的位置。到目前为止运气不好 如何实现这一点?我认为问题在于符号的编译时解析在动态加载的名称空间中不起作用。在您的示例中,bar/hello world是在编译时解析的,但在调用函数时,需求是动态完成的。我不知道有什么更好的解
load file
,load
)并将require
移动到不同的位置。到目前为止运气不好
如何实现这一点?我认为问题在于符号的编译时解析在动态加载的名称空间中不起作用。在您的示例中,
bar/hello world
是在编译时解析的,但在调用函数时,需求是动态完成的。我不知道有什么更好的解决方案,但你可以试试这样:
(ns foo)
(defn init [ns-name]
(require (symbol ns-name))
(let [bar (find-ns (symbol ns-name))]
((ns-resolve bar 'hello-world))))
这当然不是很有效,因为每次调用该函数时都会解析名称空间和函数符号。但是你应该能够理解这个想法。作为旁注,我想你指的是bar_a.clj和bar_b.clj。当然,修复了它。感谢clojurescript这不起作用
必须引用需要的参数。违规规范:(符号ns名称)
(ns foo)
(defn init [ns-name]
(require (symbol ns-name))
(let [bar (find-ns (symbol ns-name))]
((ns-resolve bar 'hello-world))))