Unquote имеет пользовательский механизм оценки, основанный на отражениях, который позволяет вам оценивать синтетические цитаты, передавая переменную среду, а не делать привязку переменной частью самого выражения.Таким образом, вы можете сделать следующее:
open Swensen.Unquote
open Microsoft.FSharp.Quotations
let unquoteway = Expr.Var(Var("x", typeof<int>))
let environment = Map.ofList [("x", box 10)]
unquoteway.Eval(environment)
Это интересно, потому что среда, в которую вы переходите, является той самой средой, которая используется для всех привязок и разрешений переменных во время вычисления выражения, поэтому соблюдаются правила переменной области видимости:
let unquoteway =
Expr.NewTuple(
[Expr.Var(new Var("x", typeof<int>))
Expr.Let(new Var("x", typeof<string>), Expr.Value("hello"), Expr.Var(new Var("x", typeof<string>)))])
let environment = Map.ofList [("x", box 10)]
unquoteway.Eval(environment)
//FSI output:
val unquoteway : Expr = NewTuple (x, Let (x, Value ("hello"), x))
val environment : Map<string,obj> = map [("x", 10)]
val it : obj = (10, "hello")