F#函数调用依赖图

时间:2014-07-15 12:04:15

标签: f# metaprogramming

我们在F#中有一个带有深度函数调用依赖图的应用程序。它以分层方式执行财务计算。

我们怎样才能提取依赖调用图?我们对完整的AST不感兴趣,只是模块/函数之间的依赖关系。

目的是拥有一个简化版本的代码,可以在与域专家的对话中使用。

1 个答案:

答案 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 exampledocumentation

本着同样的精神,如果使用ReflectedDefinitionAttribute注释函数,则可以使用Reflection,Quotations和Pattern模块来检索依赖图。 FSharp Journal中解释并详细说明了这种方法。