2014-07-24 15 views
9

Poiché gli alberi di sintassi di Roslyn sono immutabili, e il lavoro con i compilatori riguarda essenzialmente le trasformazioni (che è esattamente ciò che fa la programmazione funzionale), ho pensato che usare Roslyn in F # potesse essere una grande idea.
Quindi, è possibile combinare Roslyn e F #? Qualcuno l'ha provato prima? Ha qualche vantaggio rispetto all'utilizzo di C#? E se è possibile, vale la pena di iniziare a imparare F #?

PS: Ho una certa esperienza nella programmazione funzionale con Scheme e sto attualmente imparando Haskell, ma non ho ancora assaggiato F #.
Utilizzo di Roslyn in F #

+0

So che 'Roslyn' applica' C# ', ma come si applica questo tag (' C# ') a questa domanda? –

+2

Causa in primo luogo si tratta di manipolare il codice C# e l'albero della sintassi! Anche se posso vedere il tuo punto. – Rsh

risposta

13

Ho pensato che usare Roslyn in F # potrebbe essere una buona idea.

È sicuramente una grande idea. Alcune persone si sono chieste perché Roslyn non sia stato scritto in F # poiché la lingua è molto buona per scrivere compilatori (vedere http://neildanson.wordpress.com/2012/12/24/the-roslyn-incident/ come riferimento).

È molto facile eseguire la corrispondenza con gli AST Roslyn una volta definito un set di active patterns componibile. Vedi https://gist.github.com/jbevain/01a083c07010bc7b7cd0 come esempio convincente. Poiché gli AST di Roslyn sono immutabili, puoi anche creare combinatori per trasformarli in base al tuo scopo. I sindacati discriminati potrebbero essere usati come tipi di dati immediati se l'obiettivo è quello di sputare di nuovo i C# AST.

Lo svantaggio dell'uso di F # è che non si trovano molti esempi completi utilizzando l'API Roslyn in F #. Abbiamo un piano approssimativo per integrate Roslyn in Visual F# Power Tools. Diciamo che hai una soluzione mista C#/F #; se si desidera passare alle definizioni di un simbolo C# da un progetto F #, Roslyn è necessario per elaborare il codice C# a tale scopo. Tuttavia, ciò richiede una grande quantità di lavoro; Non so se qualcuno ci abbia lavorato.