gpt4 book ai didi

clojure - 如何在 Clojure 中搜索不是 'required' 或 'used' 的命名空间中的函数?

转载 作者:行者123 更新时间:2023-12-04 16:58:06 25 4
gpt4 key购买 nike

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

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

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

我看了 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 .

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

最佳答案

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

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

注意事项:
  • 嗯,这太天真了。
  • 它并没有摆脱所有私有(private)定义。用 ^{:private true} 定义的或 ^:private没有被过滤掉。
  • 可以使用宏生成定义。

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

    关于clojure - 如何在 Clojure 中搜索不是 'required' 或 'used' 的命名空间中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14266910/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com