是否可以将F#中本地生成的数据传递到Funscript中正在编译的表达式?
我的意思是:
let MyJSFunc str () =
Globals.alert str
let myStr = File.ReadAllText "somefile.txt"
Compiler.Compiler.Compile(<@ MyJSFunc myStr () @>,noReturn=true)
如果我使用静态字符串而不是从本地文件中读取它,那么我的猜测是Funscript试图将文件读取编译为JS,即使文件在编译时已经被读取?
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)