F# / Clojure to Javascript:与环境和JavaScript库的交互

F# / Clojure to Javascript: interaction with environment and javascript libraries

本文关键字:JavaScript 交互 环境 Clojure to Javascript      更新时间:2023-09-26

我一直在研究(大部分)可以转换为Javascript的函数式语言,这两种语言现在都站得住脚。但我对他们有两个疑问(谈论 ClojureScript 和 Pit for F#):

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

多谢!

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

调用 .NET 库
Pit 只翻译显式标记的 F# 代码,因此当您调用标准 .NET 库或某些不支持 Pit 的 F# 库时,它将无法工作(与 Live Labs Volta 项目不同Microsoft该项目现已失效)。

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

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

与 JavaScript 的互操作在 WebSharper 中不是问题。我们将大量绑定交付到现有的 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 问题重新发现。我不这样做,因为这种重复努力对人类不利。

我认为ClojureScript更适合。它具有与JavaScript相同的动态性质,并且可以使用Google闭包编译器进行输出优化。它设计为在JS虚拟机上运行。

与Clojure几乎没有区别。