2

我一直在研究(主要是)可以转换为 Javascript 的函数式语言,而这两种语言如今已经名列前茅。但是我对它们有两个疑问,(谈论 ClojureScript 和 Pit for F#):

  • 我想,由于两者都只是翻译原始语言,所以在调用任何 .Net 或 Java 时,程序无法直接编译为 Javascript。我说得对吗?如果是这样,在这种情况下,与 Java/.Net 环境交互的能力是“危险的”。
  • 据我所知,ClojureScript 可以与任何 JS 库(node.js、jquery 等)进行交互,而在 Pit 中,他们正在开发“扩展”以允许这样做......所以我假设导入任何 js 库不支持。我在 SO 中读到 WebSharper 确实支持这一点,但没有太多证据并且是封闭源代码。那么,在实践中,两种语言的任何 JS 交互的实际状态如何?

非常感谢!

4

3 回答 3

3

我不熟悉 ClojureScript,但我可以回答您关于 Pit(和 WebSharper)的一些问题。

调用 .NET 库
Pit 只翻译显式标记的 F# 代码,因此当您调用标准 .NET 库或某些不支持 Pit 的 F# 库时,它不会工作(不像Microsoft Live Labs Volta项目,它现在已经死了)。

但是,您可以在 F# 中重新实现任何此类库并告诉 Pit 改用该实现 - 如果该功能是标准 F# 库的一部分,您甚至可以从开源 F# 版本复制源代码。实际上,我认为这不是一个大问题,因为大多数 .NET 库都是特定于服务器或桌面的,因此您可能不需要那么多。

调用 JS 库
由于 F# 是一种静态类型语言,它需要知道您正在使用的事物的类型。在 Pit 和 WebSharper 中,这些是通过定义 F# 类型(没有实现)获得的,然后映射到 JavaScript。在 Pit 中,这些必须手动编写,尽管我猜测在 F# 3.0 中,这可以使用 F# 类型提供程序自动完成。我相信 WebSharper 有一个工具可以做到这一点,但它仅作为商业版本的一部分提供。

于 2012-05-31T09:59:05.817 回答
3

在 WebSharper 中与 JavaScript 互操作不是问题。我们为现有的 JS 库提供了很多绑定,如果缺少任何功能,您可以使用如下代码在 F# 中相当快速地恢复它:

[<Direct "jQuery($x).hide()">]
let hide (x: obj) = ()

F# 中的挑战是类型安全——你愿意在无类型(通常是无类型!)JavaScript 库之上改进多少类型安全和精确的代码完成。我从未使用过 ClojureScript,但我想这甚至不是一个问题,因为 Clojure 也是无类型的。

与底层 .NET 平台的互操作确实是“危险的”。正如 Tomas 所指出的,WebSharper 要求对所有 JavaScript 可调用函数进行注释。我们已经解决了一些标准类(字符串、字典、地图和集合等集合)的限制,但支持还远未完成。

使用 WebSharper,您可以在服务器上运行 .NET 代码并通过 AJAX 相当透明地使用它:

[<Remote>]
let add (x: int) (y: int) = async.Return(x + y)

[<JavaScript>]
let remoteAdd () =
    async {
        let! sum = add 1 2
        return JavaScript.Log("RESULT", sum)
    }
    |> Async.Start

不幸的是,如果您必须在客户端上运行大型 .NET 库,这不是一个解决方案,您可能不得不转向 Silverlight 的方向。

免责声明 - 我正在开发 WebSharper,所以我的输入显然是有偏见的。话虽如此,在 WebSharper 和 Pit 之间进行选择时,请记住 WebSharper 具有积极的开发、支持,并已在实际项目中使用。由于我们在较大的项目中使用它,因此我们必须注意优化输出代码并解决 F# 反射模型中的一些限制和错误,甚至为了我们的目的重写 F# 元数据读取器。这意味着我可以从 WebSharper 跟踪器中提取数十个已关闭的问题,并将它们重新发现为 Pit 问题。我不这样做,因为人类会因这种重复劳动而受到损害。

于 2012-05-31T15:31:51.620 回答
0

我认为 ClojureScript 更适合。它具有与 JavaScript 相同的动态特性,并且可以使用 Google Closure Compiler 进行输出优化。它设计为在 JS VM 上运行。

与 Clojure几乎没有区别

于 2012-06-05T06:48:48.660 回答