1

如何在 Clojure 源文件中不是“必需”或“使用”的命名空间中搜索函数?基本上我想做的是有源文件:

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

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

我看了看,ns-publics但它需要一个名称空间符号。我试图bultitude从 src/ 目录中获取所有命名空间,然后我取回了 lib.a、lib.b、lib.c、lib.main 等,但由于 main 不使用或不需要或以其他方式引用另一个使用 ns-publics 时出现错误。No namespace lib.a found根据-ns源代码中的尝试

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

4

2 回答 2

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过滤的定义。
  • 可以使用宏生成定义。

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

于 2013-01-10T23:19:58.443 回答
0

解析不会起作用,因为 clojure 是非常动态的。

所以,这样的事情可能会奏效......

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

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

于 2013-01-11T10:08:47.423 回答