谁能解释如何将 WebSharper 翻译器与 F# 结合使用?是将 F# 代码翻译成 JS 本身还是使用 F# 编译器?
在第二种情况下,当在源代码中找到 [] 属性时,F# 编译器在做什么?编译器是否会在任何情况下生成函数并在运行时将 JS 构造为编译字节码的反射或其他?
谁能解释如何将 WebSharper 翻译器与 F# 结合使用?是将 F# 代码翻译成 JS 本身还是使用 F# 编译器?
在第二种情况下,当在源代码中找到 [] 属性时,F# 编译器在做什么?编译器是否会在任何情况下生成函数并在运行时将 JS 构造为编译字节码的反射或其他?
我开发 WebSharper。好问题!
大致编译如下:
a.dll: a.fs b.fs c.fs
fsc ...
a.dll.js: a.dll
WebSharper.exe ..
当函数用 注释([<JavaScript>]
是 的别名)时[<ReflectedDefinition>]
,F# 编译器不仅将这些函数编译为 .NET IL,而且还将它们的语法表示形式存储在 DLL 元数据中。这种表示是有类型Quotations.Expr
的,可以通过反射来恢复。看看Quotations.DerivedPatterns.MethodWithReflectedDefinition
。
因此,WebSharper 是一个源到源转换器,它非常直接(例如,保留 lambda)。在 WebSharper 2.0 中,我们有一种类似于 Scheme 的中间语言,但这只是为了帮助优化生成的代码。