【发布时间】:2018-01-18 13:35:13
【问题描述】:
我不知道我的标题是否清楚,但我想使用一个函数,它使用名称空间别名加载文件,而不需要堆栈的每个名称空间中的所有库。 为了更清楚,这是一个假代码:
我要加载的文件(“whatever.clj”):
{:my-fn (fn [a b] (ml/explode a b))}
定义阅读器的命名空间:
(ns my-project.reader
(:require [my-lib.core :as ml]))
(defn load-definition-and-apply
[a b]
(let [{:keys [my-fn]} (load-file "whatever.clj")]
(my-fn a b)))
所以如果我从my-project.reader 运行load-definition-an-apply,它将工作,因为ml/explode 已定义。
但现在想象一下,我从其他地方使用 load-definition-and-apply :
(ns my-project.processing
(:require [my-project.reader :as rd]))
(rd/load-definition-and-apply 1 2)
将无法工作,因为在加载文件期间从 my-project.processing 中找不到 ml 别名。当我将代码包装在其他进程周围时也是如此。
解决办法是:
(ns my-project.processing
(:require [my-lib.core :as ml]
[my-project.reader :as rd]))
(rd/load-definition-and-apply 1 2)
这对于一个库来说是可以的,但我实际上导入了几个。有没有一种干净的方法可以不在塔的每个命名空间中导入读取文件所需的库,而只是为加载文件在概念上真正“执行”的命名空间调用它(这里:my-project.reader)?
我也不想加载 clj 文件,因为它被设计为对用户来说很简单。
谢谢
【问题讨论】:
-
查看
binding或in-ns或沿着这些思路。我已经完成了,如果没有人回答我会的,只是现在没有时间。 -
谢谢,我按照您的建议使用了绑定,并且成功了!
标签: clojure namespaces