所以我有一個名爲evalExpr的函數,它接受一個報價< @ ... @>並返回一個值。 例如,如果我寫在F#引用中插入一個變量值
let v = evalExpr <@ 22 + 2 * 22 + 45 @>
那麼,v等於111
現在,我要報價裏面一個字符串變量放置表達式代替,但這樣做,變量是部分的報價,因此沒有定義。
如何在F#中的引號內使用變量值?
所以我有一個名爲evalExpr的函數,它接受一個報價< @ ... @>並返回一個值。 例如,如果我寫在F#引用中插入一個變量值
let v = evalExpr <@ 22 + 2 * 22 + 45 @>
那麼,v等於111
現在,我要報價裏面一個字符串變量放置表達式代替,但這樣做,變量是部分的報價,因此沒有定義。
如何在F#中的引號內使用變量值?
目前還不清楚你究竟在詢問什麼,但也許這樣會有所幫助?
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 @>
我想在輸入中獲得一個表達式並解決它具有該功能。出於這個原因,輸入中的表達式必須是由Console.ReadLine()所取的字符串。例如,如果我在輸入「22 + 2 * 22 + 45」中插入,它應該像正常報價一樣返回111。無論如何,我無法用這段代碼來完成,返回的結果是Unsupported表達式。 x和y從哪裏獲得價值?我怎樣才能給一個輸入值? – user1714647
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
!
在代碼'valWith(Map.ofList [(「x」,box 2)])q'框中,需要一個整數值。在我的例子中,我採用了更復雜的表達方式。出於這個原因,用戶將能夠在輸入中插入一個數字,並且它將處理計算。如果我插入一個字符串(如「2 + 2 * 2」),它不起作用,所以我不解決問題。無論如何,你爲什麼把雙倍;;? F#甚至不需要它們。 – user1714647
引用可以用文字字符串或合成方式構建,但是沒有將F#代碼的動態字符串轉換爲引用的開箱即用功能。但是你可以寫一個這樣的例程給你的自己:例如一個函數'parse:string - > Quotations.Expr',它將一個字符串解析成一個AST,並從中建立一個引用。顯然,你不會爲整個F#語言編寫解析器,而是爲一個小型的算術語言編寫解析器。 –
我使用';;'因爲我在FSI工作。你當然可以在F#源文件中省略那些。 –
問題是什麼?您可以在引號內使用外部變量,如下所示,例如:http://blog.ploeh.dk/2014/03/21/composed-assertions-with-unquote –
您是否想說要解析表達式出了字符串? –
或者你在找這樣的東西:https://github.com/mathnet/mathnet-symbolics/blob/master/src/Symbolics/Script.fsx#L143 –