如何在Clojure中“不需要”或“使用”的命名空间中搜索函数?

时间:2013-01-10 20:42:42

标签: clojure namespaces

如何在Clojure源文件中的'required'或'used'命名空间中搜索函数?基本上我想做的是拥有源文件:

main.clj,
a.clj,
b.clj,
c.clj

所有编译在一起但不直接import / require / use a,b或c在main中。相反,我主要采用命令行参数,然后搜索正确的函数(甚至可能只是一个完全限定的符号)。

我查看了ns-publics,但它需要一个名称空间符号。我尝试bultitude从src / dir获取所有命名空间,然后我返回lib.a,lib.b,lib.c,lib.main等,但是因为main不使用或者不需要或者否则请参考其他命名空间我使用ns-publics收到错误。 No namespace lib.a found根据try in the-ns source code

如何查看项目中包含的代码的公共接口,但不能直接引用特定文件,甚至是引用的依赖项?

2 个答案:

答案 0 :(得分:0)

这是一个简单的解决方法,可能会有所帮助,直到出现更好的解决方案。它返回文件中定义的所有公共符号的列表。让我们阅读文件并查找所有def性别。忽略私人,即defn-

(let [file (with-in-str (str "(" (slurp filename) ")") (read))
      defs (filter #(.matches (str (first %)) "^def.*[^-]$") file)
      symbols (map second defs)]
  symbols)

注意事项:

  • 嗯,这简直就是天真。
  • 它没有摆脱所有私人定义。使用^{:private true}^:private定义的内容不会被过滤掉。
  • 可以使用宏生成定义。

最后一点特别令人不安。检测宏生成的定义的唯一合理方法是使用阅读器评估文件,至少部分。

答案 1 :(得分:0)

解析不起作用,因为clojure非常有活力。

所以,这样的事情可能有用......

(load-file "file_with_stuff.clj")
(ns-publics (find-ns 'file-with-stuff))
(remove-ns 'file-with-stuff)

如果你想动态地做所有事情,那么你可以使用符号生成符号 - 应该仍然有效。删除ns是可选的。它不会造成任何伤害,但它会让你回到起步的地方。