Вставьте значение переменной внутри цитаты 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 @>
Другие вопросы по тегам