【问题标题】:Can I refer another namespace and expose its functions as public for the current ns?我可以引用另一个命名空间并将其功能公开为当前 ns 吗?
【发布时间】:2011-06-11 13:18:11
【问题描述】:

我以为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,即使对于我不扩充的功能也是如此。

【问题讨论】:

    标签: namespaces clojure


    【解决方案1】:

    有选择地执行此操作(明确指定每个函数)的一种方法是使用 Zach Tellman 的 Potemkin library 之类的方法。在 lamina.core 命名空间中可以找到它的使用示例,该命名空间用作 Lamina 的公共入口点,从所有其他内部命名空间导入关键公共功能。

    你也可以使用clojure.contrib.def/defalias:

    (use 'clojure.contrib.def/defalias)
    (defalias foo clojure.string/blank?)
    (foo "")
    

    【讨论】:

    【解决方案2】:

    这有帮助吗?

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

    【讨论】:

    • 嗯。有用,但似乎仅限于仅包含函数的命名空间:Can't take the value of a macro
    【解决方案3】:

    要从命名空间中提取可能定义了宏的所有内容,请使用 this

    (defmacro pullall [ns]
      `(do ~@(for [[sym var] (ns-publics ns)]
               `(def ~sym ~var))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多