2012-03-30 10 views
11

F#コードであると思われるテキスト文字列を取得し、F#コードに解析して結果を画面に表示するにはどうすればよいですか?F#コードにテキスト文字列を解析する

私はそれが.NETの機能によって解決されると思っています。だから、F#自体やC#で行うことができます。

これはおそらくtryfsharp.orgで解決されますか?

+3

これを見て価値があるかもしれません(http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f) –

+2

あなたまた、[f#コードを使用することができます(http://stackoverflow.com/questions/2608114/f-equivalent-to-eval) –

答えて

11

F# CodeDom providerを使用して望みを達成することができます。以下の最小限の実行可能なスニペットは、必要な手順を示しています。おそらく正しいF#コードを文字列から取り出し、アセンブリファイルにコンパイルしようとします。成功した場合は、dllファイルからこの単なる合成アセンブリをロードし、そこから既知の関数を呼び出します。それ以外の場合は、コードをコンパイルする際の問題点が示されます。火力アップビーイング

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" 

あなたがつもり、それはFSharp.Compiler.dllFSharp.Compiler.CodeDom.dllを参照する必要がスニペットで遊ぶ場合には、予想される出力

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

を生成します。楽しい!

0

F#には、あなたが望むことができるインタプリタfsi.exeがあります。私はそれにもいくつかのAPIがあると思う。

4

私はそれが.NETの機能によって解決されると推測しています。そのため、F#自体やC#で行うことができます。

いいえ。 F#は比較的長いメタプログラミング機能を提供します。関連するコードをF#コンパイラ自体からリッピングする必要があります。

+0

[OK]を、私は半分が可能ではないことを知っている。 .NET FrameworkのC#-partまたは何かについてはどうですか? –

+1

いいえ。 F#が存在することをフレームワークが知っているものは何もありません。これにはAPIはありませんが、ソースコードはすべて入手可能ですので、自分で構築することもできます。長期的には、あなたがこれを行う方法を示すサンプルを公開したいと思いますが、私たちはまだそれらを準備していません。 – Brian