簡體   English   中英

生成F#代碼

[英]Generating F# code

T4是C#/ VB.NET的“官方”代碼生成引擎。 F#不支持它 (這是從四月開始,但我找不到任何新的提及)。 那么生成F#代碼的好方法是什么?

編輯:

我想在F#中實現2-3個手指樹 我已經在C#中實現了它們,所以這應該是一個很好的比較。 樹的“數字”和節點可以表示為數組,因此

type 't FingerTree = Empty | Single of 't | Deep of 't array * (('t FingerTree) array) lazy * 't array

但是,這些數組的最大大小非常小,所以很高興

type 't Digit = Digit1 of 't | Digit2 of 't*'t | Digit3 of 't*'t*'t | Digit4 of 't*'t*'t*'t
type 't Node = Node2 of 't FingerTree * 't FingerTree | Node3 of 't FingerTree * 't FingerTree * 't FingerTree 
type 't FingerTree = Empty | Single of 't | Deep of 't Digit * ('t Node) lazy * 't Digit

避免邊界檢查等

但是手動編寫Digit和Node上的所有函數變得更加困難,並且生成它們會更好。 而類似T4的方法看起來很完美......

由於F#不支持解決方案資源管理器中的自定義工具,因此可以將T4文件放在C#或Visual Basic項目中,並將其輸出重定向到F#項目。 以下是使用T4 Toolbox的方法

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="txt" #>
<#@ include file="T4Toolbox.tt" #>
<#
    FSharpTemplate template = new FSharpTemplate();
    template.Output.Project = @"..\Library1\Library1.fsproj";
    template.Output.File = "Module2.fs";
    template.Render();
#>
<#+
class FSharpTemplate: Template
{
    public override string TransformText()
    {
#>
// Learn more about F# at http://fsharp.net

module Module2
<#+
        return this.GenerationEnvironment.ToString();
    }
}

#>

這取決於你想要做什么。 雖然這種方法並不像許多T4示例所示的那樣真正適合生成模板,但總的來說,我建議設計一個“組合器庫”[1]用於F#中的代碼生成或面向語言的編程任務。 我們的想法是設計一些組合器來表示你試圖生成的代碼,從組合器生成F#源文本,然后通過代碼DOM編譯它。

然而,通常只是為組合器編寫解釋器而不是生成代碼會更容易。

F#中組合器的好例子是:

[1] http://en.wikipedia.org/wiki/Combinator_library

我查看了各種選項,最后使用* .fsx腳本來完成我相對簡單和靜態的代碼生成需求,該腳本使用帶有fprintf的TextWriter來寫出生成的F#代碼。

我實際上使用FParsec進行一些解析工作,但由於我沒有將其他語法轉換為F#,因此這兩部分之間幾乎沒有關系。

我主要同意羅伯特(雖然有些情況下使用F#中的T4非常有用)。 無論如何,也許知道為什么要生成F#代碼會很有趣? 然后我們可以建議一些典型的功能解決方案:-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM