2013-03-10 3 views
7

私はシンボリック派生エンジンを構築しています。例えばF#のコード引用をコンパイルする最新の方法は何ですか

let f = <@ fun x:double -> x * x @> 
let df = der f 

得られた発現のために

<@ 2 * x @> 

実際の方程式は、任意に複雑になる可能性があろう。

誘導体の生成は、再帰的 パターンマッチングと変換を使用して、あまりにもハードではないですが、最終的に私が手 それらを書いていたかのようにタイトな数値ループ内 生成された数式を使用します。これは数値計算コードなので、常により速いです (可能であれば)

私はFSharpXの引用コンパイラを見ましたが、コンパイラではなくインタープリタのように見えます。

+6

私はまた、ペンと紙でメープル、matlab、ピラブと計算法を知っています。私の質問は、コード引用をコンパイルすることでした。 – bradgonesurfing

+0

私は、他の言語で実装しようとする代わりに、本質的にシンボリック操作をサポートする言語を使用することをお勧めします。 –

+0

また、以前は多くの人がこれに尋ねてきました。 GoogleまたはStackOverflowで検索してください。 –

答えて

7

これはテストしていませんが、F#引用符をLINQ式に変換(およびコンパイル)するコードは、F#PowerPackからF#コアライブラリに移動しました。そのため、最新バージョン:

open Microsoft.FSharp.Linq.RuntimeHelpers 

LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @> 

とラムダのためにそれを使用する

let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @> 
    :?> (double -> double) 

Console.WriteLine(d 10) 

出力

11 

"obj"を正しい型のラムダに変換する最後のキャストに注意してください

+0

非常にクールな新しいもの。非常に短い不要書類を除いて、Google上でこれに関する言及はありません。私がEvaluateQuotationを持っていたらbtw <@ fun y -> y + 1 @>例えば、返される型obj。これを適切なラムダに変換する方法。私はキャストが必要だと思う。 – bradgonesurfing

+0

明白な次の質問は、実行時とコンパイル時の間にLINQ式がどのように実際のコードに変換されるのでしょうか? – bradgonesurfing

関連する問題