Как передать аргументы в функцию funscript?

Можно ли передать данные, сгенерированные локально в F#, в выражение, которое компилируется в Funscript?

Пример того, что я имею в виду:

let MyJSFunc str () =
    Globals.alert str

let myStr = File.ReadAllText "somefile.txt"

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

Если я использую статическую строку вместо чтения ее из локального файла, это работает, поэтому я предполагаю, что Funscript пытается скомпилировать чтение файла в JS, даже если файл уже прочитан к тому времени, когда он достигает компиляции?

1 ответ

Решение

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)
Другие вопросы по тегам