我们在F#中有一个带有深度函数调用依赖图的应用程序。它以分层方式执行财务计算。
我们怎样才能提取依赖调用图?我们对完整的AST不感兴趣,只是模块/函数之间的依赖关系。
目的是拥有一个简化版本的代码,可以在与域专家的对话中使用。
答案 0 :(得分:6)
Scott Wlaschin在他的'Cycles and modularity in the wild'文章中做过类似的事情。 His approach使用Mono.Cecil作为元数据阅读器并在SVG中吐出依赖图。最近的一篇文章'Analysis of Roslyn vs. the F# compiler'使用the same method。
您可以为您的目的修改这些脚本。缺点是方法不是很精确;当代码编译为IL时,某些F#特定信息可能会丢失。
另一种方法是使用FSharp.Compiler.Service作为元数据阅读器;它的优点是灵活性,但是,可能需要一些时间来习惯FSharp.Compiler.Service API。您可以从程序集签名开始遍历整个层次结构。这是relevant example和documentation。
本着同样的精神,如果使用ReflectedDefinitionAttribute注释函数,则可以使用Reflection,Quotations和Pattern模块来检索依赖图。 FSharp Journal中解释并详细说明了这种方法。