是否可以将在F#中本地生成的数据传递给在Funscript中编译的表达式?
我的意思是:
let MyJSFunc str () =
Globals.alert str
let myStr = File.ReadAllText "somefile.txt"
Compiler.Compiler.Compile(<@ MyJSFunc myStr () @>,noReturn=true)
如果我使用静态字符串而不是从本地文件中读取它,那么我的猜测就是Funscript尝试将文件读取编译为JS,即使该文件在到达编译时已经被读取了?
答案 0 :(得分:3)
FunScript尝试翻译所有顶级声明的代码。正如您所提到的,这包括您的MyJSFunc
函数以及myStr
值(这在访问文件系统时是不可能的)。
解决此问题的一种方法是将myStr
转换为本地声明。这样,F#会将其值存储在报价中(而不是存储定义):
let MyJSFunc str () =
Globals.alert str
let translate () =
let myStr = File.ReadAllText "somefile.txt"
Compiler.Compiler.Compile(<@ MyJSFunc myStr () @>,noReturn=true)
另一种做同样事情的方法是使用引用拼接并使用Expr.Value
显式创建引用值:
open Microsoft.FSharp.Quotations
Compiler.Compiler.Compile(<@ MyJSFunc (%Expr.Value(myStr)) () @>,noReturn=true)