2

是否可以将 F# 中本地生成的数据传递给在 Funscript 中编译的表达式?

我的意思的例子:

let MyJSFunc str () =
    Globals.alert str

let myStr = File.ReadAllText "somefile.txt"

Compiler.Compiler.Compile(<@ MyJSFunc myStr () @>,noReturn=true)

如果我使用静态字符串而不是从本地文件中读取它,它可以工作,所以我的猜测是 Funscript 尝试编译读取到 JS 的文件,即使文件在到达编译时已经被读取?

4

1 回答 1

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)
于 2015-02-24T13:13:43.960 回答