Вставьте значение переменной внутри цитаты F#
Поэтому у меня есть функция с именем evalExpr, которая принимает в качестве аргумента кавычку <@... @> и возвращает значение. Например, если я напишу
let v = evalExpr <@ 22 + 2 * 22 + 45 @>
тогда v равно 111.
Теперь я хочу поместить внутри цитат строковую переменную вместо выражений, но при этом переменная является частью цитаты и поэтому не определена.
Как я могу использовать значения переменных внутри цитат в F#?
2 ответа
Unquote функции оператора evalWith : Map<string,obj> -> Quotations.Expr<'a> -> 'a
это позволяет вам оценивать синтетические предложения с несвязанными переменными, используя карту среды, которая предоставляет значения переменных.
Во-первых, откройте Swensen.Unquote
пространство имен, чтобы сделать evalWith
оператор доступен.
open Swensen.Unquote;;
Затем создайте цитату, которая представляет переменную x
типа int
:
let xvar : Quotations.Expr<int> = Quotations.Expr.Var(new Quotations.Var("x", typeof<int>)) |> Quotations.Expr.Cast;;
Затем составьте цитату с xvar
сращены в:
let q = <@ %xvar + 10 @>;;
Теперь вы можете оценить вашу цитату q
с переменной x
при условии, что так:
evalWith (Map.ofList [("x", box 2)]) q;;
Ответ 12
!
Непонятно, что именно вы просите, но, может быть, что-то подобное поможет?
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 @>