Генерация кода F # - PullRequest
       28

Генерация кода F #

6 голосов
/ 02 февраля 2010

T4 - это «официальный» механизм генерации кода для C # / VB.NET. Но F # не поддерживает (это с апреля, но я не смог найти более новые упоминания). Так что же является хорошим способом для генерации кода F #?

EDIT:

Я хочу реализовать 2-3 пальца в F #. Я уже реализовал их в 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 ]

7 голосов
/ 04 февраля 2010

Поскольку 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();
    }
}

#>
6 голосов
/ 02 февраля 2010

Это зависит от того, что вы пытаетесь сделать. Хотя этот подход не очень подходит для генерации шаблонов, как показывают многие примеры T4, в целом я бы рекомендовал разработать «библиотеку комбинаторов» [1] для генерации кода или задач языкового программирования в F #. Идея состоит в том, чтобы спроектировать некоторые комбинаторы для представления кода, который вы пытаетесь сгенерировать, генерируя исходный текст F # из комбинаторов, а затем компилируя его с помощью кода DOM.

Однако часто было бы проще просто написать интерпретатор для ваших комбинаторов, чем генерировать код.

Хорошие примеры комбинаторов в F #:

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

4 голосов
/ 03 февраля 2010

Я посмотрел вокруг на различные варианты и в итоге нашел свои относительно простые и статические потребности в генерации кода, используя скрипт * .fsx, который использует TextWriter с fprintf для записи сгенерированного кода F #.

На самом деле я использую FParsec для какой-то работы по синтаксическому анализу, но поскольку я не перевожу другой синтаксис на F #, эти две части имеют мало общего друг с другом.

1 голос
/ 03 февраля 2010

Я в основном согласен с Робертом (хотя, безусловно, в некоторых ситуациях использование T4 из F # может быть очень полезным). В любом случае, может быть, было бы интересно узнать , почему вы хотите сгенерировать код F #? Тогда мы могли бы предложить какое-то типичное функциональное решение проблемы: -).

...