【问题标题】:F# / Clojure to Javascript: interaction with environment and javascript librariesF#/Clojure 到 Javascript:与环境和 javascript 库的交互
【发布时间】:2026-02-12 04:15:01
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • @JoelMueller 除了非常严格的许可证之外,是否可以作为 AGPL 版本的一部分为 JS 库生成 F# 包装器?
  • @Joel,哦!谢谢。自从我上次看它以来,它已经改变了。也想知道托马斯的问题。既然我知道它是免费软件,我会尝试找到一些东西。
  • 是的,从 JS 库生成 F# 包装器的工具也在 WebSharper 的 AGPL 下。另外,您不必使用该工具,可以编写手动内联声明:)

标签: javascript clojure f# clojurescript


【解决方案1】:

我不熟悉 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 有一个工具可以做到这一点,但它仅作为商业版本的一部分提供。

【讨论】:

  • 您确定 WebSharper 工具仅在商业版本上提供吗?我一直在浏览他们的网站,但没有找到有关该位许可的任何信息。使用 F# TypeProviders for Pit 的想法很好。我想象着将 F#/Clojure 与 node.js 和更多的 JS 库一起使用。在某些情况下可能有意义,但不知道翻译成 javascript 和与此类库交互的实际困难。非常感谢!
  • 该工具的来源在这里:bitbucket.org/IntelliFactory/websharper/src/515fc8d48ecd/… - 它是 AGPL 涵盖的标准 WebSharper 的一部分。不过目前它没有使用 TypeProviders,而是更传统的编译时代码生成。
  • @toyvo 非常感谢您花时间查看代码。我在他们的网页上进行了快速搜索,但没有任何具体内容。我没有(愚蠢的我)想过直接查看源...所以谢谢你,因为这是可能存在的最好的确认。
  • 这是我工作的一部分,因为我编写了该代码 :) 如果您尝试 WS,我们将很乐意为您提供进一步帮助
【解决方案2】:

与 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 问题。我不知道,因为这样的重复劳动会损害人类的利益。

【讨论】:

  • 非常感谢 toyvo 的精彩评论。显然,不要不尊重 Pit 的工作,但时间较长且已在多个实际项目中使用的东西更有机会被完善。关于 F# 到 JS 我在想两个目的:第一个是玩 node 等技术和所有新的 JS 技术浪潮,开发 HTML5 接口等。第二个是能够拥有 JS 代码我可以使用 phonegap、appcelerator 等进行部署。第一个只是为了好玩,第二个是为了编写一些可以在任何地方运行的应用程序的必要性。
  • 很抱歉再次打扰,但请注意,商业 WebSharper 产品的代码与免费产品的代码相同吗?因此,它只取决于开发程序选择的许可选项:商业或任何免费许可例外/AGPLv3。这是正确的吗?感谢您释放该产品,它为我们提供了一种尝试和测试它的方式,同时如果程序最终在商业上可行,则可以选择支付许可证费用。干得好!
  • 当前购买许可证不会解锁任何额外功能(源代码或二进制代码) - 默认情况下您拥有它。如果您想开发封闭源代码网站,您希望从更快的支持和修补程序中受益,购买许可证是合适的。
【解决方案3】:

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

few differences from Clojure

【讨论】: