调用从文件加载的Clojure函数

时间:2016-07-03 15:41:17

标签: clojure

我正在研究用于吉他谱的clojure DSL,我希望允许用户通过在已知文件位置(例如apply-clojure-plugin)中定义名为plugins.clj的函数来编写插件。

我试过了:

  • load文件并调用该函数(导致“无法找到符号:apply-clojure-function”。
  • 添加declare以避免上述问题(导致“尝试调用未绑定的fn”)

我猜这是某种名称空间问题,但我不知道如何在这里使用ns-resolve(如果它甚至是必要的话)。

编辑:我最终用resolve解决了这个问题。问题是apply-clojure-plugin未在编译时定义(因为它在文件中定义),因此在编译期间会引发错误。调用(resolve 'apply-clojure-plugin)可以正常工作。

1 个答案:

答案 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"