2009-05-11 5 views
11

明らかに何かを見逃していないことを願っていますが、F#式で試しています。例えば、私はこのような何か書きたい:F#で引用符で囲まれた式を評価する

let x = <@ 2 * 5 @> 
let y = transform x // replaces op_Multiply with op_Addition, or <@ 2 + 5 @> 
let z = eval y // dynamically evaluates y, returns 7 

を引用式を評価することができます内蔵のF#の方法はありますか、私は自分自身を記述する必要がありますか?

答えて

8

いいえ、F#引用をコンパイルする組み込みの方法はありません。 PowerPack LINQを使用すると、SOME引用を.NET System.Linq.Expressions.Expressionに変換し、それを使用してコンパイルすることができます。

SQLやGPUカードをターゲットとするなど、コードの解釈を可能にするために引用が行われました。

しかし、ハブの投稿では、これが一般的なリクエストであり、見ていることが示唆されています。

0

私は引用には.eval()の方法があると思います。

+0

1 NuGetパッケージに記載されています。私はあなたと私の答えが3つのコメントアウトされたdownvotesを持っている理由を理解していない... –

+0

これはどのような名前空間がありますか?私はそれを見ていないよ。ありがとう! –

15

Unquoteの一部としてリフレクションベースの見積りエバリュエーターを実装しました(これはバージョン2.0.0の新機能です)。

> #r @"..\packages\Unquote.2.2.2\lib\net40\Unquote.dll" 

--> Referenced '..\packages\Unquote.2.2.2\lib\net40\Unquote.dll' 

> Swensen.Unquote.Operators.eval <@ sprintf "%A" (1,2) @>;; 
val it : string = "(1, 2)" 

私はPowerPackの評価者より50倍高速だと評価しました。これはもちろん、シナリオによって異なります。しかし、Unquoteは一般に、式を解釈する際のPowerPackよりも高速です。

また、VarSet、PropertySet、FieldSet、WhileLoop、ForIntegerRangeLoop、Quoteなど、PowerPackの評価ツールよりも多くの式をサポートしています。実際、Unquoteの評価者は、最終的にサポート予定のすべての引用式、 NewDelegate、AddressSet、およびAddressOfをサポートしています。

+0

テストパートなしで、ライブラリを任意の引用符で囲まないで使用する方法はありますか? –

+2

@ChadZawistowskiはい、任意のunquoting(逆コンパイルと引用の評価)に利用できる 'decompile'、' reduce'、 'reduceAll'、' eval'、 'unquote'を含む一般的な関数があります。 –

8

あなたは次のようにFSharp.PowerPack.Linq DLLが提供するEval延長部材を使用してのF#の引用を評価することができます:あなたはLinq.QuotationEvaluation名前空間をopenしなければならない

#r "FSharp.PowerPack.Linq.dll" 

open Linq.QuotationEvaluation 
let f = <@2 + [email protected]> 
f.Eval() 

注この延長部材を利用できるようにします。

延期を返すCompile拡張メンバもありますが、パフォーマンスは向上していません。

+1

+1 Jon、これは、PowerPackのエバリュエーターの使い方を完全に説明した唯一の答えです。 –

+0

ええ、それはコメントアウトされていないdownvoteを持っています。 –

+0

誰があなたを落としたのかはっきりしていませんが、私はあなたの役に立つ答え<3 – Juliet

6

は2016

で更新され、それが実際に `Eval`ですがEvaluate拡張メソッドは現在FSharp.Quotations.Evaluator

#r "../packages/FSharp.Quotations.Evaluator.1.0.7/lib/net40/FSharp.Quotations.Evaluator.dll" 

open FSharp.Quotations.Evaluator 

let f = <@ 2 + 3 @> 
f.Evaluate() 
関連する問題