Как передать аргументы в функцию 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)