我认为use
会这样做,但似乎在当前命名空间中创建的映射不是公共的。这是我想要实现的一个例子:
(ns my-ns
(:use [another-ns :only (another-fct)]))
(defn my-fct
[]
(another-fct 123)) ; this works fine
然后我有另一个这样的命名空间:
(ns my-ns-2
(:require [my-ns :as my]))
(defn my-fct-2
[]
(my/another-fct 456)) ; this doesn't work
我想这样做是因为another-ns
是一个访问数据库的库。我想在单个命名空间(my-ns
)中隔离对此库的所有调用,这样所有与数据库相关的函数都将在单个命名空间中隔离,如果需要,可以更轻松地切换到另一个数据库。 / p>
这个库的一些功能对我来说很好,但我想增加其他功能。假设读取函数没问题,但我想通过一些验证来扩充写函数。
到目前为止,我看到的唯一方法是将所有映射手动编码为my-ns
,即使对于我没有增加的函数也是如此。
答案 0 :(得分:12)
选择性地执行此操作(明确指定每个函数)的一种方法是使用类似Zach Tellman的Potemkin library之类的东西。它的一个使用示例位于lamina.core命名空间,该命名空间用作Lamina的公共入口点,从所有其他内部命名空间导入关键公共函数。
您还可以使用clojure.contrib.def/defalias:
(use 'clojure.contrib.def/defalias)
(defalias foo clojure.string/blank?)
(foo "")
答案 1 :(得分:9)
这有帮助吗?
(defmacro pull [ns vlist]
`(do ~@(for [i vlist]
`(def ~i ~(symbol (str ns "/" i))))))
以下是一个例子:
(ns my-ns)
(defmacro pull [ns vlist]
`(do ~@(for [i vlist]
`(def ~i ~(symbol (str ns "/" i))))))
(pull clojure.string (reverse replace))
(defn my-reverse
[]
(reverse "abc"))
(ns my-ns-2)
(defn my-fct-2 []
(list (my-ns/my-reverse)
(my-ns/reverse "abc")))
(my-fct-2)
如果您想要拉入所有内容,那么:
(defmacro pullall [ns]
`(do ~@(for [i (map first (ns-publics ns))]
`(def ~i ~(symbol (str ns "/" i))))))
(pullall clojure.string)
答案 2 :(得分:1)
从可能具有定义宏的命名空间中提取所有内容
(defmacro pullall [ns]
`(do ~@(for [[sym var] (ns-publics ns)]
`(def ~sym ~var))))