2012-03-30 14 views
11

Come posso prendere una stringa di testo, che dovrebbe essere il codice F #, e analizzarla nel codice F #, per stampare i risultati sullo schermo?Analizzare una stringa di testo con il codice F #

Suppongo che sarebbe risolto tramite una funzionalità in .NET, quindi può essere eseguita tramite F # o C#.

In che modo questo è probabilmente risolto su tryfsharp.org?

+3

Potrebbe valere la pena dare un'occhiata a questa [domanda] (http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f) –

+2

You potrebbe anche usare [codifica f #] (http://stackoverflow.com/questions/2608114/f-equivalent-to-eval) –

risposta

11

Il desiderato può essere raggiunto utilizzando F# CodeDom provider. Uno snippet eseguibile minimo di seguito mostra i passaggi richiesti. Prende un codice F # arbitrariamente presumibilmente corretto da una stringa e tenta di compilarlo in un file assembly. Se ha successo, carica questo assembly appena sintetizzato dal file dll e invoca una funzione conosciuta da lì, altrimenti mostra qual è il problema con la compilazione del codice.

open System 
open System.CodeDom.Compiler 
open Microsoft.FSharp.Compiler.CodeDom 

// Our (very simple) code string consisting of just one function: unit -> string 
let codeString = 
    "module Synthetic.Code\n let syntheticFunction() = \"I've been compiled on the fly!\"" 

// Assembly path to keep compiled code 
let synthAssemblyPath = "synthetic.dll" 

let CompileFSharpCode(codeString, synthAssemblyPath) = 
     use provider = new FSharpCodeProvider() 
     let options = CompilerParameters([||], synthAssemblyPath) 
     let result = provider.CompileAssemblyFromSource(options, [|codeString|]) 
     // If we missed anything, let compiler show us what's the problem 
     if result.Errors.Count <> 0 then 
      for i = 0 to result.Errors.Count - 1 do 
       printfn "%A" (result.Errors.Item(i).ErrorText) 
     result.Errors.Count = 0 

if CompileFSharpCode(codeString, synthAssemblyPath) then 
    let synthAssembly = Reflection.Assembly.LoadFrom(synthAssemblyPath) 
    let synthMethod = synthAssembly.GetType("Synthetic.Code").GetMethod("syntheticFunction") 
    printfn "Success: %A" (synthMethod.Invoke(null, null)) 
else 
    failwith "Compilation failed" 

Essere sparato-up che produce l'uscita prevista

Success: "I've been compiled on the fly!" 

Se hai intenzione di giocare con lo snippet richiede riferimento FSharp.Compiler.dll e FSharp.Compiler.CodeDom.dll. Godere!

0

F # ha un interprete fsi.exe che può fare ciò che si desidera. Penso che abbia anche qualche API.

4

Suppongo che sarebbe risolto tramite una funzionalità in .NET, quindi può essere eseguita tramite F # stesso o C#.

No. F # fornisce servizi di metaprogrammazione relativamente docili. Dovrai estrarre il codice pertinente dal compilatore F # stesso.

+0

Ok, allora so che metà non è possibile. Che ne dici di C# -part o qualcosa del .NET Framework? –

+1

No; niente che il framework sappia che F # esiste. Non ci sono API per questo nel prodotto, sebbene tutto il codice sorgente sia disponibile in modo da poterlo creare autonomamente. Credo che nel lungo periodo vorremmo pubblicare esempi che dimostrino come puoi farlo, ma non li abbiamo ancora preparati. – Brian

Problemi correlati