2014-07-15 42 views
3

我們在F#中有一個應用程序,它帶有深度函數調用依賴關係圖。它以分層方式執行財務計算。F#函數調用依賴關係圖

我們如何提取依賴關係調用圖?我們對完整的AST不感興趣,只是模塊/函數之間的依賴關係。

目的是要有一個簡化版本的代碼,可用於與領域專家的對話。

+0

是的,他們這樣做。但是他們目前的規格非常尷尬和複雜。我們已經在一些POC中製作了原型,可以用更簡單的方式解釋該域。因此,該計劃將與領域專家一起設計一個更好的模型(順便說一句,模型設計專家)。 – jruizaranguren

+1

如果你能控制源代碼,並且不介意重構,你可以做Prismatic所做的事情,並且圍繞函數編寫包裝,這樣你就可以提取圖形(http://www.infoq.com/presentations/Graph- Clojure的棱柱)。在F#中,我想你可以使用這個計算表達式(或者只是特殊的「裝飾器」函數)。 – Grundoon

+0

棱柱/方案的類似方法正是我所需要的(儘管這個特定問題在其範圍內被縮小和正確回答)。我想知道哪種方法可以做到最好(更確切的問題)。本質上,Prismatic/Schema允許定義函數輸入輸出的聲明性規範,並通過特殊關鍵字將它們與實現關聯起來。並且使用簡單的地圖,因此可以在5 LOC中構建一個圖形,並且可以輕鬆製作真正有趣的東西(模擬,部分圖形構建,測試等)。 – jruizaranguren

回答

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中進行了解釋和詳細說明。