如何在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。
如何查看项目中包含的代码的公共接口,但不能直接引用特定文件,甚至是引用的依赖项?
答案 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是可选的。它不会造成任何伤害,但它会让你回到起步的地方。