繁体   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