【问题标题】:What function/macro to check what namespaces are currently 'used' and how to check if one in particular is used?什么函数/宏来检查当前“使用”了哪些命名空间以及如何检查是否使用了特定的命名空间?
【发布时间】:2011-10-20 09:38:46
【问题描述】:

Clojure 中是否有一个函数/宏来检查当前'使用' 的命名空间?哪一个?所以我的意思不是“我们目前在哪个命名空间中”,而是例如,我想知道“clojure.contrib.string”当前是否被“使用”,如(use 'clojure.contrib.string) 中那样。我的意思不是“必需”。

如何编写一个函数,例如在使用 'clojure.contrib.string(通过符号提供的命名空间的名称)时给出 true,否则为 false? (defn ns-used? [name] (...)

【问题讨论】:

    标签: namespaces clojure


    【解决方案1】:

    all-ns 正如 kotarak 所建议的那样,与您正在寻找的内容很接近,但它也为您提供了所有 required 没有被引用的命名空间。

    否则ns-refers 会为您提供命名空间中引用的所有函数的映射。与ns-mapns-imports 类似且可能也很有趣,它们为您提供了所有导入的类或记录的映射。

    如果您想严格查找引用函数的所有命名空间,您可以执行以下操作:

    (defn ns-used? [ns]
      (let [referred-namespaces (set (map (fn [[k v]] (:ns (meta v))) (ns-refers *ns*)))] 
        (contains? referred-namespaces (find-ns ns))))
    

    如果您愿意检查命名空间是否为requiredused,您可以这样做

    (defn ns-used-or-required? [ns]
      (contains? (set (all-ns)) (find-ns ns)))
    

    您必须在引号中传递符号:

    (ns-used? 'clojure.core)
    

    【讨论】:

    • @MichielBorkent 我做了一些挖掘工作,all-ns 实际上还为您提供了所有required 命名空间。请参阅我的答案以获取从其引用函数的所有命名空间的解决方案(就像您 use 命名空间的情况一样)。
    • 嗯,是的,看我编辑过的帖子。 (set (map ...)) 的东西从函数被引用的地方获取所有命名空间。
    【解决方案2】:

    all-ns 了解“二手”的一些合适定义。

    ns-refers 了解“二手”的其他定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2014-12-03
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多