2014-03-31 60 views
2

所以我有一個名爲evalExpr的函數,它接受一個報價< @ ... @>並返回一個值。 例如,如果我寫在F#引用中插入一個變量值

let v = evalExpr <@ 22 + 2 * 22 + 45 @> 

那麼,v等於111

現在,我要報價裏面一個字符串變量放置表達式代替,但這樣做,變量是部分的報價,因此沒有定義。

如何在F#中的引號內使用變量值?

+0

問題是什麼?您可以在引號內使用外部變量,如下所示,例如:http://blog.ploeh.dk/2014/03/21/composed-assertions-with-unquote –

+0

您是否想說要解析表達式出了字符串? –

+0

或者你在找這樣的東西:https://github.com/mathnet/mathnet-symbolics/blob/master/src/Symbolics/Script.fsx#L143 –

回答

0

目前還不清楚你究竟在詢問什麼,但也許這樣會有所幫助?

type Vars<'a> private() = 
    static let dict = System.Collections.Generic.Dictionary<string,Quotations.Var>() 
    static member Var(nm) = 
     match dict.TryGetValue nm with 
     | true, v -> v 
     | _ -> 
      let v = Quotations.Var(nm, typeof<'a>) 
      dict.[nm] <- v 
      v 

[<GeneralizableValue>] 
let x<'a> : Quotations.Expr<'a> = Quotations.Expr.Var(Vars<'a>.Var "x") |> Quotations.Expr.Cast 

[<GeneralizableValue>] 
let y<'a> : Quotations.Expr<'a> = Quotations.Expr.Var(Vars<'a>.Var "y") |> Quotations.Expr.Cast 


let q1 = <@ %x + %y * (1 + %x) @> 

let q2 = <@ "test" + %x @> 
+0

我想在輸入中獲得一個表達式並解決它具有該功能。出於這個原因,輸入中的表達式必須是由Console.ReadLine()所取的字符串。例如,如果我在輸入「22 + 2 * 22 + 45」中插入,它應該像正常報價一樣返回111。無論如何,我無法用這段代碼來完成,返回的結果是Unsupported表達式。 x和y從哪裏獲得價值?我怎樣才能給一個輸入值? – user1714647

3

Unquote設有運營商evalWith : Map<string,obj> -> Quotations.Expr<'a> -> 'a,使您可以評估合成報價與使用環境的地圖,提供了變量值綁定的變量。

首先,打開Swensen.Unquote命名空間以使evalWith運算符可用。

open Swensen.Unquote;; 

接着,構建其表示int類型的變量x的報價:

let q = <@ %xvar + 10 @>;; 

現在可以評估:

let xvar : Quotations.Expr<int> = Quotations.Expr.Var(new Quotations.Var("x", typeof<int>)) |> Quotations.Expr.Cast;; 

接着,構建具有xvar報價在拼接你的報價q與變量x提供像這樣:

evalWith (Map.ofList [("x", box 2)]) q;; 

答案是12

+0

在代碼'valWith(Map.ofList [(「x」,box 2)])q'框中,需要一個整數值。在我的例子中,我採用了更復雜的表達方式。出於這個原因,用戶將能夠在輸入中插入一個數字,並且它將處理計算。如果我插入一個字符串(如「2 + 2 * 2」),它不起作用,所以我不解決問題。無論如何,你爲什麼把雙倍;;? F#甚至不需要它們。 – user1714647

+2

引用可以用文字字符串或合成方式構建,但是沒有將F#代碼的動態字符串轉換爲引用的開箱即用功能。但是你可以寫一個這樣的例程給你的自己:例如一個函數'parse:string - > Quotations.Expr',它將一個字符串解析成一個AST,並從中建立一個引用。顯然,你不會爲整個F#語言編寫解析器,而是爲一個小型的算術語言編寫解析器。 –

+0

我使用';;'因爲我在FSI工作。你當然可以在F#源文件中省略那些。 –