F# / Clojure to Javascript:与环境和JavaScript库的交互
F# / Clojure to Javascript: interaction with environment and javascript libraries
我一直在研究(大部分)可以转换为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几乎没有区别。
- Javascript没有't更新DOM,直到用户交互
- 使用JavaScript验证用户交互/输入-这是一种很好的方法
- 交互2个单选按钮2个不同的功能Javascript
- 为什么某些Javascript属性没有在调试器中以交互方式显示
- 为什么在node.js中,c++插件和javascript之间的交互非常昂贵
- 使用Javascript与选择输入交互
- CSS3转换和javascript交互
- 在C#中,我如何对客户端用户交互和javascript(jQuery)代码进行单元测试
- 如何在JavaScript中测量交互和mousedown事件之间的延迟
- JavaScript/Wicket:如何显示阻止用户交互的覆盖
- 好奇:禁用jQuery和Javascript交互,除非用户已登录
- 画布,JavaScript交互
- 当用户与IFrame JavaScript交互时进行检测
- 在Django/Javascript交互中没有响应的POST
- 如何在javascript交互的php页面之间正确传递变量
- Android javascript交互-试图上传文件到CGI
- 我需要让我的按钮与这个蚀刻草图的Javascript交互
- 服务器上的脚本与客户端 Javascript 交互
- 最佳服务器API和客户端Javascript交互方法
- 选择标签php生成的代码需要javascript交互