首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Funscript中导出接口

如何在Funscript中导出接口
EN

Stack Overflow用户
提问于 2013-09-26 19:59:46
回答 2查看 500关注 0票数 4

我已经找到Funscript的例子了。现在,我正在尝试做一些类似Funscript库的东西,它有函数(希望还有类!)可以从javascript代码调用。但是我看不到从Funscript生成的.js中访问任何东西的方法。

简而言之,如何让Javascript调用Funscript?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-08 23:17:11

对不起,FunScript不是为这个用例设计的。它是为在脚本中使用来自不同来源的代码和数据而设计的,而不是作为库导出代码。

您会注意到FunScript生成的代码非常难看。我们最近稍微改进了它,但是这些更改只能直接从FunScript存储库获得(在编写本报告时)。要从其他基于JavaScript的语言中生成JavaScript,还有很长的路要走。

现在,改进代码生成并不是项目的高度优先任务。我们不希望在积极添加大量新功能的同时,以任何特定的样式/格式生成代码。另外,很难将F#中的一些概念映射到可消费和可执行的JavaScript中。例如:

  • 泛型类型、方法和函数
  • 泛型类型约束(如等式和比较)
  • 反射

为了说明泛型情况,假设在F#中有一个泛型函数,它使用比较约束对泛型类型的实例数组进行排序。首先,将它与诸如int这样的原始数字类型一起使用。其次,将它与记录类型一起使用。如果在这两种情况下都生成相同的JavaScript代码,并且通过调用某些方法(例如,对对象上的Compare(...) )来实现比较,这将导致数值情况下的性能非常差。为了获得更好的性能,需要对生成的代码进行一些专门化。在这里,可以内联映射到内置于JavaScript类型(如数字和字符串)的JavaScript类型的比较。这提供了更好的性能,但是,您现在有了多个JavaScript版本的同一个F#函数。没有一种清晰的方法可以以一种简单易用的方式呈现生成的代码。

总之,FunScript设计做出了一些权衡,优先考虑对泛型的支持、性能和反映,而不是代码生成。您可能想看一下WebSharper。它可以支持这个用例。

票数 3
EN

Stack Overflow用户

发布于 2014-01-11 11:37:28

您可以通过将函数放在window对象上来公开它们。例如:

代码语言:javascript
复制
[<ReflectedDefinition>]
module Program

open FunScript
open FSharp.Data
open System.IO

module Foo =
  let SayHello name = Globals.window.alert ("Hello, " + name)

[<JSEmitInlineAttribute("window.SayHello = {0};")>]
let expose(f : string -> unit) : unit = failwith "never"

// Create a function that will be compiled into JavaScript...
let main () =
  expose(Foo.SayHello)

然后您可以从javascript访问它们:

代码语言:javascript
复制
window.SayHello("Ray");

或者,实际上,只是:

代码语言:javascript
复制
SayHello("Ray");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19037579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档