2013-03-04 14 views
11

Esiste un modo per eseguire il codice F # in C#? Ho scritto un'app in C# - Mi piacerebbe fornirgli la possibilità di eseguire F #, leggere gli oggetti Record, enumerare gli elenchi da F #. Qual è la soluzione attuale per questo? So che in futuro ci sarà probabilmente un modo per farlo tramite un aggiornamento a Roslyn. Inoltre, curioso di come eseguire il codice F # in F #, al momento. C'è un modo per farlo facilmente?Esegui codice F # in C# - (Come C# in C# usando Roslyn)

risposta

9

Attualmente, è necessario creare una libreria F # e quindi chiamarla da C#. Poiché F # è solo .NET, l'uso della libreria F # è (principalmente) proprio come l'utilizzo di qualsiasi altra libreria C#. Si potrebbe voler esaminare FSharpX per questa parte, tuttavia, poiché fornisce alcune utilità per facilitare la chiamata di F # da C# e viceversa.

Se si desidera compilare F # in modo dinamico da C#, è necessario utilizzare l'implementazione F # CodeDom da F# Power Pack. Questo ti permetterà di usare CodeDom per compilare F # al volo, e poi eseguirlo da C#.

Si noti che Roslyn non aiuterà in questo caso, anche quando è stato rilasciato, in quanto non supporta F # come modello di codice, solo C# e VB.Net. Sarebbe potenzialmente possibile usare Roslyn per manipolare e compilare C# da F #, ma non viceversa.

8

In aggiunta alle opzioni che Reed ha già menzionato, ci sono altre due alternative basate sull'uso di F # Interactive - è possibile eseguirlo come processo separato o si può usare la versione open source per fare riferimento e chiamare direttamente (che è piuttosto impegnativo, però).

Quindi, in sintesi, sono disponibili tre opzioni:

  • è possibile avviare il processo di fsi.exe e valutare codice F # in ambiente F # Interactive (con l'invio di codice F # per il processo con standard input). L'associazione F # per MonoDevelop è un buon esempio su come farlo (vedi InteractiveSession.fs).

    L'unica difficoltà è la comunicazione tra i due processi, ma penso che questo dovrebbe essere possibile utilizzando un canale remoto .NET (o WCF) tra i due. Puoi anche leggere lo standard output di F # Interactive, ma potrebbe essere un po 'troppo semplice.

  • È possibile utilizzare il rilascio open source di F# compiler & tools per fare riferimento a parti rilevanti del compilatore F # e chiamarle (come libreria) per valutare il codice F #. Questa sarebbe l'opzione migliore e ti darebbe più o meno le stesse opzioni disponibili con C# interattivo di Roslyn.

    Purtroppo, questo non è un compito abbastanza facile - stavo giocando con l'idea di fare questo e ho fatto qualche progresso (posso condividerlo), ma non è ancora finito. L'idea è di prendere il codice sorgente di fsi.exe (here), rimuovere tutta l'interfaccia utente e trasformarla in una libreria.

  • Utilizzando CodeDOM, è possibile richiamare il compilatore F # (fsc.exe) per compilare il codice F # in un'applicazione (o libreria) autonoma, caricarlo dinamicamente ed eseguirlo.Uno svantaggio è che questo inizierà una nuova istanza del compilatore ogni volta che lo usi e quindi potrebbe essere un po 'lento (dipende dal tuo scenario)
7

Poiché la domanda è stata posta, c'è stato molto di sviluppo interessante :-)

ora è possibile farlo molto facilmente utilizzando il progetto F# Compiler Services:

il pacchetto # servizi compilatore F è un componente derivato dal codice sorgente # compilatore F che espone funzionalità aggiuntive per l'attuazione di F # collegamenti linguistici, strumenti aggiuntivi basati sul compilatore o sul refactoring utensili. Il pacchetto include anche il servizio interattivo F # che può essere utilizzato per incorporare lo scripting F # nelle tue applicazioni.