10

T4は、C#/VB.NETの「公式」コード生成エンジンです。しかし、F#はそれをサポートしていません(これは4月からですが、新しい言及は見つかりませんでした)。では、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のようなアプローチはそれに最適に見えます...

4

4 に答える 4

8

F#はソリューションエクスプローラーのカスタムツールをサポートしていないため、T4ファイルをC#またはVisual Basicプロジェクトに配置し、それらの出力をF#プロジェクトにリダイレクトできます。T4Toolboxでそれを行う方法は次のとおりです。

<#@ 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();
    }
}

#>
于 2010-02-04T12:17:57.413 に答える
6

それはあなたが何をしようとしているのかによります。これは、多くのT4の例が示すようにテンプレートを生成するのにはあまり適していないアプローチですが、一般に、F#でのコード生成または言語指向プログラミングタスク用の「コンビネータライブラリ」[1]を設計することをお勧めします。アイデアは、生成しようとしているコードを表すいくつかのコンビネーターを設計し、コンビネーターからF#ソーステキストを生成し、コードDOMを介してこれをコンパイルすることです。

ただし、多くの場合、コードを生成するよりも、コンビネーター用のインタープリターを作成する方が簡単です。

F#のコンビネータの良い例は次のとおりです。

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

于 2010-02-02T09:13:55.600 に答える
5

fprintf私はさまざまなオプションを検討し、TextWriterを使用して生成されたF#コードを書き出す* .fsxスクリプトを使用して、比較的単純で静的なコード生成のニーズに行き着きました。

私は実際にいくつかの解析作業にFParsecを使用していますが、他の構文からF#に変換していないため、2つの部分は互いにほとんど関係がありません。

于 2010-02-02T22:28:08.537 に答える
1

私はRobertにほぼ同意します(ただし、F#からT4を使用すると非常に役立つ場合もあります)。とにかく、なぜF#コードを生成したいのかを知ることは興味深いでしょう?次に、問題に対するいくつかの典型的な機能的解決策を提案することができます:-)。

于 2010-02-02T21:45:40.927 に答える