namespaces - 我可以引用另一个命名空间并将其功能公开为当前 ns 吗?

标签 namespaces clojure

我认为 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)中,这样所有依赖于数据库的函数都将被隔离在一个命名空间中,并且如果需要,切换到另一个数据库变得更容易。

这个库的一些功能对我来说很好,但我想增加其他功能。假设读取功能很好,但我想通过一些验证来增加写入功能。

到目前为止,我看到的唯一方法是将所有映射手动编码到 my-ns 中,即使对于我不增加的功能也是如此。

最佳答案

这有帮助吗?

(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)

关于namespaces - 我可以引用另一个命名空间并将其功能公开为当前 ns 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4732134/

相关文章:

使用命名空间时找不到php Doctrine 类

javascript - 带有 ECMAScript 6 类的命名空间

jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同

Clojure pmap 返回与 map 不同的结果

java - 如何将这个 Java 示例翻译成惯用的 Clojure?

Clojure,使用循环函数进行映射

c++ - 匿名命名空间类定义

c++ - 不在 header 中包含所有函数声明以创建 "private namespace"是否可以接受?

ExtJS5 命名空间困惑

json - 如何将clojure代码映射到JSON?