Generating F# code

前端 未结 4 1640
春和景丽
春和景丽 2021-02-06 01:58

T4 is the \"official\" code generation engine for C#/VB.NET. But F# doesn\'t support it (this is from April, but I couldn\'t find any newer mentions). So what is a good way to g

相关标签:
4条回答
  • 2021-02-06 02:19

    I looked around at various options, and ended up for my relatively simple and static code-generation needs using a *.fsx script that uses a TextWriter with fprintf to write out the generated F# code.

    I actually do use FParsec for some parsing work, but as I'm not translating from some other syntax into F#, the two pieces have little to do with each other.

    0 讨论(0)
  • 2021-02-06 02:20

    I mostly agree with Robert (though there are certainly some situations where using T4 from F# could be very useful). Anyway, maybe it would be interesting to know why do you want to generate F# code? Then we could maybe suggest some typical functional solution to the problem :-).

    0 讨论(0)
  • 2021-02-06 02:24

    It depends what your trying to do. While it's an approach that's not really suitable for generating templates in the way many T4 examples show, in general I would recommend designing a "combinators library" [1] for code generation or language oriented programming tasks in F#. The idea is to design some combinators to represent the code you're try to generate, generating F# source text from combinators, then compiling this via the code DOM.

    However often it would be easier simply to write an interpreter for your combinators rather than generating code.

    Good examples of combinators in F# are:

    • http://www.quanttec.com/fparsec/
    • http://www.codeplex.com/fscheck/

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

    0 讨论(0)
  • 2021-02-06 02:25

    Because F# doesn't support custom tools in solution explorer, you can place your T4 files in a C# or Visual Basic project and redirect their output to your F# project. Here is how you can do it with 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();
        }
    }
    
    #>
    
    0 讨论(0)
提交回复
热议问题