我正在研究用于吉他谱的clojure DSL,我希望允许用户通过在已知文件位置(例如apply-clojure-plugin
)中定义名为plugins.clj
的函数来编写插件。
我试过了:
load
文件并调用该函数(导致“无法找到符号:apply-clojure-function”。declare
以避免上述问题(导致“尝试调用未绑定的fn”)我猜这是某种名称空间问题,但我不知道如何在这里使用ns-resolve
(如果它甚至是必要的话)。
编辑:我最终用resolve
解决了这个问题。问题是apply-clojure-plugin
未在编译时定义(因为它在文件中定义),因此在编译期间会引发错误。调用(resolve 'apply-clojure-plugin)
可以正常工作。
答案 0 :(得分:1)
您要么(load "plugins")
(如果包含该文件的目录在类路径上),要么(load-file "path/to/plugins.clj")
从相对于执行(或绝对路径)的已知文件路径加载。
如果文件不包含ns
表单,您将能够直接访问其定义。否则,您需要知道文件定义了哪些ns,并且可以使用alias
将该命名空间映射到您自己的命名空间:
;; make a new namespace for demonstration purposes
:user=> (ns foo)
nil
;; a definition in the other namespace
:foo=> (def bar "hello")
#'foo/bar
;; switch back to the original namespace
:foo=> (in-ns 'user)
#object[clojure.lang.Namespace 0x14a50707 "user"]
;; our definition is not visible
:user=> (resolve 'bar)
nil
;; but it is visible based on the fully qualified namespace
+user=> (resolve 'foo/bar)
#'foo/bar
;; using alias, we can make a convenient shorthand
+user=> (alias 'f 'foo)
nil
+user=> f/bar
"hello"